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

Posted

技术标签:

【中文标题】Socket.IO-client.java 反复断开重连【英文标题】:Socket.IO-client.java disconnect and reconnect repeatedly 【发布时间】:2015-03-07 17:50:48 【问题描述】:

我在我的节点服务器上为我的 android 项目使用 socket.io-client.java 和 socket.io 1.2.1,并且 android 套接字与服务器正常连接,但几分钟后它会自动断开连接并重复重新连接。我无法解决问题,有人可以帮助我吗?

我正在使用 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);
    );
);

这是日志截图

【问题讨论】:

有一个解决方法。参考This 【参考方案1】:

我通过向 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);

【讨论】:

它对我有用,但会产生什么后果......以及为什么会出现此错误【参考方案2】:

我在我的 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 polling error'【参考方案3】:

对我来说,问题是我在服务器端(Flask)错误地使用了 Socket.IO,并且在后台使用了 HTTP 长轮询而不是 websockets。原来,Flask webserver 不支持 websockets,所以我不得不使用eventlet WSGI server:

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)

【讨论】:

以上是关于Socket.IO-client.java 反复断开重连的主要内容,如果未能解决你的问题,请参考以下文章

k8s一节点ip无故反复断连接

手机wifi反复断开连接

Ubuntu Wifi网络连接不上或经常断网

win10 3dmax 激活后反复激活和激活码无效问题

191116

小程序开发 云函数超时设置了,但还是3s警报