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

Kotlin Socket.IO客户端无法连接Node.js Socket.IO服务器求助

Kotlin Socket.IO客户端无法连接Node.js Socket.IO服务器的解决办法

我遇到了Kotlin Socket.IO客户端无法连接Node.js Socket.IO服务器的问题。已通过HTML网页客户端成功连接到该服务器,但使用Kotlin客户端连接时失败,创建Socket对象时使用了本地IP地址“127.0.0.1:3000”并尝试建立连接,但抛出异常。

服务器代码

const express = require('express');
const {createServer} = require('node:http')
const {Server}= require('socket.io');
const {join} = require('node:path');
var PORT = process.env.PORT || 3000;

function main (){

const app = express();    
const server = createServer(app);
const io = new Server(server);

app.get('/', (req, res)=>{
    res.sendFile(join(__dirname, 'index.html'));
});

io.on('connection', (socket)=>{
    console.log(socket.id);
});

server.listen(PORT, ()=>{
    console.log('server running at port '+PORT);
});

}

main();

Kotlin客户端代码

class Client{
   private lateinit var socket: Socket
    @Synchronized
    fun setSocket(){
        try {
            val option = IO.Options();
            option.transports = arrayOf("websocket");
            socket = IO.socket("http://127.0.0.1:3000", option)
        }catch (e: URISyntaxException){
            println("error when creating socket")
        }
    }
    @Synchronized
    fun getSocket(): Socket {
        return socket
    }

    @Synchronized
    fun establishConnection(){
        try{
            socket.connect()
        }catch (e:Exception){}

    }

    @Synchronized
    fun closeConnection(){
        try {
            socket.disconnect()
        }catch (e:Exception){
        }
    }

}

fun main() {
    val client = Client()
    client.setSocket()
    client.establishConnection()
}

抛出的异常

GRAVE: Task threw exception java.lang.RuntimeException: Stub! at org.json.JSONObject.<init>(JSONObject.java:115) at io.socket.engineio.client.HandshakeData.<init>(HandshakeData.java:16) at io.socket.engineio.client.Socket.onPacket(Socket.java:541) at io.socket.engineio.client.Socket.access$1000(Socket.java:36) at io.socket.engineio.client.Socket$5.call(Socket.java:337) at io.socket.emitter.Emitter.emit(Emitter.java:117) at io.socket.engineio.client.Transport.onPacket(Transport.java:124) at io.socket.engineio.client.Transport.onData(Transport.java:116) at io.socket.engineio.client.transports.WebSocket.access$100(WebSocket.java:23) at io.socket.engineio.client.transports.WebSocket$1$2.run(WebSocket.java:73) at io.socket.thread.EventThread$2.run(EventThread.java:80) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:840)

Exception in thread "EventThread" java.lang.RuntimeException: Stub! at org.json.JSONObject.<init>(JSONObject.java:115) at io.socket.engineio.client.HandshakeData.<init>(HandshakeData.java:16) at io.socket.engineio.client.Socket.onPacket(Socket.java:541) at io.socket.engineio.client.Socket.access$1000(Socket.java:36) at io.socket.engineio.client.Socket$5.call(Socket.java:337) at io.socket.emitter.Emitter.emit(Emitter.java:117) at io.socket.engineio.client.Transport.onPacket(Transport.java:124) at io.socket.engineio.client.Transport.onData(Transport.java:116) at io.socket.engineio.client.transports.WebSocket.access$100(WebSocket.java:23) at io.socket.engineio.client.transports.WebSocket$1$2.run(WebSocket.java:73) at io.socket.thread.EventThread$2.run(EventThread.java:80) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base/java.lang.Thread.run(Thread.java:840)

问题原因与解决办法

这个Stub!异常是因为使用了Android SDK中的org.json包Stub实现,该Stub仅能在Android运行环境中工作,无法在普通JVM环境下运行。

解决步骤

  1. 替换JSON依赖:移除Android的org.json依赖,改用适用于JVM的JSON库,比如org.json:json。
    若使用Gradle,在build.gradle.kts中添加:
    dependencies {
        implementation("org.json:json:20240303")
        // 保留Socket.IO客户端依赖,示例:
        implementation("io.socket:socket.io-client:2.1.0")
    }
    
  2. 版本兼容性检查:确保Kotlin客户端的Socket.IO版本与Node.js服务器版本匹配。比如服务器用Socket.IO v4.x,客户端需使用兼容版本(io.socket:socket.io-client:2.1.0兼容v4.x服务器)。
  3. 添加连接监听:在客户端代码中添加连接状态监听,便于排查问题:
    修改establishConnection方法:
    @Synchronized
    fun establishConnection(){
        socket.on(Socket.EVENT_CONNECT) {
            println("连接成功")
        }
        socket.on(Socket.EVENT_CONNECT_ERROR) { error ->
            println("连接错误: ${error[0]}")
        }
        socket.on(Socket.EVENT_DISCONNECT) {
            println("断开连接")
        }
        try{
            socket.connect()
        }catch (e:Exception){
            println("连接异常: ${e.message}")
        }
    }
    
  4. 清理环境依赖:若在普通Kotlin/JVM项目中运行,移除所有Android相关依赖,避免依赖冲突。

内容的提问来源于stack exchange,提问作者diego alvarez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:59:56