Android应用无法连接Golang Socket.IO服务器问题求助
Kotlin Socket.IO客户端无法连接Golang Socket.IO服务器问题
已通过netstat -ano确认8000端口被TCP占用,Golang Socket.IO服务器运行正常,服务器与Android模拟器处于同一网络,但Kotlin客户端始终无法建立连接。
Golang Socket.IO服务器代码
import ( "fmt" "net/http" socketio "github.com/googollee/go-socket.io" "github.com/googollee/go-socket.io/engineio" "github.com/googollee/go-socket.io/engineio/transport" "github.com/googollee/go-socket.io/engineio/transport/polling" "github.com/googollee/go-socket.io/engineio/transport/websocket" ) server := socketio.NewServer(&engineio.Options{ Transports: []transport.Transport{ &polling.Transport{ CheckOrigin: allowOriginFunc, }, &websocket.Transport{ CheckOrigin: allowOriginFunc, }, }, }) server.OnConnect("/", func(s socketio.Conn) error { s.SetContext("") fmt.Println("connected:", s.ID()) return nil }) server.OnEvent("/", "notice", func(s socketio.Conn, msg string) { fmt.Println("notice:", msg) s.Emit("reply", "have "+msg) }) server.OnError("/", func(s socketio.Conn, e error) { fmt.Println("meet error:", e) }) server.OnDisconnect("/", func(s socketio.Conn, reason string) { fmt.Println("closed", reason) }) go server.Serve() defer server.Close() http.Handle("/socket.io/", server) http.Handle("/", http.FileServer(http.Dir("./asset"))) fmt.Println("ScktSrv Serving at localhost:8000...") fmt.Print(http.ListenAndServe(":8000", nil))
Android Kotlin客户端代码
权限与依赖
<uses-permission android:name="android.permission.INTERNET" />
implementation ('io.socket:socket.io-client:2.0.0') { exclude group: 'org.json', module: 'json' }
连接代码
try { mSocket = IO.socket("http://localhost:8000/skt") Log.d(TAG, "success: ${mSocket.id()}") } catch (e: Exception) { e.localizedMessage?.let { Log.e(TAG, it) } } mSocket.connect() mSocket.on(Socket.EVENT_CONNECT, onConnect) mSocket.on("reply", onReply) private var onConnect = Emitter.Listener { Log.i(TAG, "onConnect") mSocket.emit("notice", "{\"relay_num\": 4, \"to_status\": 1}") } private var onReply = Emitter.Listener { Log.i(TAG, "replyMsg: ${it[0]}") }
问题更新记录
更新1
已在AndroidManifest.xml中添加android:usesCleartextTraffic="true",但Socket.connected()仍返回false。同时疑问:连接服务器是否只需使用http://10.0.2.2:8000,无需附加路径?
更新2
客户端日志反复出现以下内容:
tagSocket(6) with statsTag=0xffffffff, statsUid=-1
更新3
测试基础TCP代码可正常建立连接,但使用googollee的Socket.IO库却无法连接。
Golang基础TCP代码
listener, _ := net.Listen("tcp", ":8000") for { conn, _ := listener.Accept() fmt.Printf("%s --- %s\n", conn.LocalAddr(), conn.RemoteAddr()) io.WriteString(conn, "welcome to socket") }
Android Kotlin基础TCP代码
val host = "192.168.100.250" val port = 8000 Executors.newSingleThreadExecutor().execute { try { val socket = java.net.Socket(host, port) receiveMove(socket) } catch (e: ConnectException) { Log.e(TAG, "Socket ConnExc: ${e.localizedMessage}") runOnUiThread { Toast.makeText(this, "connection failed", Toast.LENGTH_SHORT).show() } }catch (e: Exception) { Log.e(TAG, "Socket ConnExc: ${e.localizedMessage}") } }
更新4
将Android端Socket.IO依赖版本更换为0.8.3后,客户端可连接服务器,但会立即断开,陷入连接-断开循环,服务器日志显示closed client namespace disconnect。
内容的提问来源于stack exchange,提问作者rminaj
相关产品推荐
相关产品推荐

