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环境下运行。
解决步骤
- 替换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") } - 版本兼容性检查:确保Kotlin客户端的Socket.IO版本与Node.js服务器版本匹配。比如服务器用Socket.IO v4.x,客户端需使用兼容版本(
io.socket:socket.io-client:2.1.0兼容v4.x服务器)。 - 添加连接监听:在客户端代码中添加连接状态监听,便于排查问题:
修改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}") } } - 清理环境依赖:若在普通Kotlin/JVM项目中运行,移除所有Android相关依赖,避免依赖冲突。
内容的提问来源于stack exchange,提问作者diego alvarez
相关产品推荐
相关产品推荐

