You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:17:20