안녕하세요. 이번에 서버쪽이랑 같이 공부하려고 소켓 통신 에제를 실행해보려고 했는데
인터넷에 있는 코드들을 10개는 넘게 작성해 본 것 같은데 전혀 안되서 2일째 골치아픈 상황입니다.
일단 상황은 안드로이드에서 Socket을 사용해서 nodejs서버와 소켓을 연결하는데, 코드는 아래처럼 작성했습니다.
package com.example.myapplication
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import io.socket.client.IO
import io.socket.client.Socket
import io.socket.emitter.Emitter
import java.net.URISyntaxException
class MainActivity : AppCompatActivity() {
lateinit var mSocket: Socket
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
try{
mSocket = IO.socket("http://192.168.XXX.XXX:3000")
mSocket.connect()
Log.d("test", "socket.io connected !!");
}catch(e: URISyntaxException){
Log.e("MainActivity", e.reason)
}
mSocket.on(Socket.EVENT_CONNECT, onConnect);
}
val onConnect = Emitter.Listener {
Log.d("TAG", "connect!")
}
}
var app = require('express')();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
app.get('/', (req, res) => {
console.log("user connect22");
res.send({"result":"hello"});
});
io.on('connection', function(socket) {
console.log("user connect");
});
server.listen(3000, function(){
console.log("server on 3000");
});
테스트를 위해서 최대한 간단하게 작성했습니다.
클라이언트에서 try블록 내의 Log는 정상적으로 찍히는걸 확인했습니다.
그런데 서버 쪽에서 io.on내부의 콘솔 로그가 찍히지 않는 걸 보니 정상적으로 연결이 안된 것 같습니다.
확인해본 해결 방법은
1. manifest에 INTERNET권한 추가.
2. manifest에 android:usesCleartextTraffic="true"추가
3. 포트 포워딩, 방화벽 해제
4. 주소 공인IP로 변경(127.XXX.XXX.XXX)
5. 서비스쪽으로 코드 옮겨서 코루틴으로 실행
retrofit을 사용해서 서버에 get요청을 보내면 정상적으로 request가 오는건 확인했는데
소켓 통신만 안되는 상황입니다..
코드도 인터넷에서 찾아서 10번은 넘게 바꿔본 것 같은데 아무리 해도 안되네요ㅠ
*오타 수정했습니다.(해결안됨)
*공인IP로 모바일에서 접속하니까 정상적으로 연결됐습니다!
전에 로컬에서는 안된다고 하는 글을 본 적이 있는데...
*안드로이드 스튜디오에서 ADV로 실행해도 정상 작동하네요..?
스튜디오를 재설치 해서 그런가, 아니면 그 외에 몇 가지 했던 것 덕분에 해결 된 건가 잘 모르겠네요;
3일간 고생은 대체 뭐였는지 ㅠㅠ