Socket.IO-client.java 断开连接并反复重新连接

8
我正在使用 socket.io-client.javasocket.io 1.2.1 在我的节点服务器上为我的安卓项目进行开发。安卓套接字与服务器连接正常,但几分钟后它会自动断开并不断重新连接。我无法找出问题所在,有人能帮忙吗?
我正在使用 socket.io-client-0.1.1.jar、engine.io-client-0.2.1.jar 和 Java-WebSocket-1.3.0.jar 库。
这是Java代码:
private void socketTest() throws URISyntaxException{

    socket = IO.socket("http://192.168.169.2:8082");
    socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {

      @Override
      public void call(Object... args) {
        socket.emit("test", "awesome");

      }

    }).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {

      @Override
      public void call(Object... args) {}

    });
    socket.connect();

}

以下是服务器端代码

io.on('connection', function (socket) {
    console.log('a user connected');
    socket.on('disconnect', function () {
       console.log('user disconnected');
    });

    socket.on('test',function(msg){
       console.log("This is "+msg);
    });
});

以下是日志截图:

enter image description here


1
有一个解决方法。请参考此链接 - miqe
3个回答

8
我通过在socket.io中添加一个具有无限超时选项的选项来解决了这个问题。
 IO.Options options = new IO.Options();
 OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder()
        .connectTimeout(0, TimeUnit.MILLISECONDS)
        .readTimeout(0, TimeUnit.MILLISECONDS)
        .writeTimeout(0, TimeUnit.MILLISECONDS);
 options.callFactory = clientBuilder.build();
 socket = IO.socket(URL, options);

它对我起作用了,但会有什么后果呢?为什么会出现这个错误? - ManishNegi

4

我在 Android 项目中使用 socket.io-client:1.0.0 客户端库时遇到了相同的问题,但是在降低 socket.io 版本后,它正常工作。您可以尝试使用以下客户端版本。

 compile('io.socket:socket.io-client:0.8.3') {
    exclude group: 'org.json', module: 'json'
}

你好,我遇到了同样的问题。在降级后,我收到了“xhr轮询错误”。 - ManishNegi

0
对我来说,问题在于我在服务器端(Flask)错误地使用了Socket.IO,并且HTTP长轮询被用作底层而不是WebSockets。结果发现,Flask Web服务器不支持WebSockets,因此我不得不使用eventlet WSGI服务器:

run.py

from myapp import create_app, socketio
import eventlet

eventlet.monkey_patch()

config = 'config.py'
app = create_app(config)

if __name__ == '__main__':
    socketio.run(app)

extensions.py

from flask_jwt_extended import JWTManager
...
from flask_socketio import SocketIO

jwt = JWTManager()
...
socketio = SocketIO(logger=True, async_mode='eventlet')

__init__.py

import eventlet
from eventlet import wsgi
from myapp.extensions import jwt, socketio

def create_app(config_filename):
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_pyfile(f"../{config_filename}")
    app.config.from_pyfile(config_filename)

    register_extensions(app)

    wsgi.server(eventlet.listen(('', 5000)), app)

def register_extensions(app):
    socketio.init_app(app)

客户端代码:

在客户端:

class MessagesRepository @Inject constructor(
    private val prefs: SharedPreferences
) {
    private val options = IO.Options.builder()
            .setTransports(arrayOf(WebSocket.NAME))
            .setExtraHeaders(
                    mapOf("Authorization" to listOf(prefs.getString(ACCESS_TOKEN, "")),
                          "Content-type" to listOf("application/json")))
            .build()
    private val socket = IO.socket(getBaseUrlForCurrentDevice(), options)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接