Android Nkzawa SocketIO 断开连接并建立新连接

Posted

技术标签:

【中文标题】Android Nkzawa SocketIO 断开连接并建立新连接【英文标题】:Android Nkzawa SocketIO disconnect and make new connection 【发布时间】:2015-04-30 15:24:33 【问题描述】:

我正在使用 android、socketio (nkzawa)。当我第一次连接时工作正常。但是,如果我断开连接并尝试建立“另一个连接”,则永远不会调用 EVENT_CONNECT。

这里我放了一些sn-ps

当我连接时

BeforeActivity 内部

@Override
public void onResume() 
    super.onResume();   
    socketManager = (socketManager) socketManager.Instance(this, UrlHelper.URL.replaceAll("\\userId\\", userId.toString());

然后我有从 GenericSocket 扩展的类 SocketManager,其中我有一个用于单例的变量 (SocketManager) 实例

public static SocketManager Instance(SocketListener listener, String url) 

  if (instance == null) 
    instance = new socketManager(url);
    instance.init();
  

  socketManager.listener = (listener)listener;

  return instance;

套接字的初始化是在 GenericSocket 类中完成的,其中我有一个类型为 (com.github.nkzawa.socketio.client.Socket ) 的变量,称为套接字

protected void init() 
    try 
        socket = IO.socket(url);
        socket
        .on(com.github.nkzawa.socketio.client.Socket.EVENT_CONNECT, new Emitter.Listener() 

            @Override
            public void call(Object... args) 
                onConnect();
                JSONObject connectionMessage = getConnectionMessage();
                socket.emit(MESSAGE_JOIN, connectionMessage);
            

        ).on(MESSAGE, new Emitter.Listener() 
            @Override
            public void call(Object... args) 
                Object data = args[0];
                if (data instanceof JSONObject) 
                    JSONObject json = (JSONObject) data;
                    try 
                        onMessage(json.get("content").toString());
                     catch (Exception ex) 
                        Log.e(TAG, ex.getMessage());
                    
                 else 
                    onMessage(data.toString());
                

            
        ).on(Constant.CONNECTION, new Emitter.Listener() 
            @Override
            public void call(Object... args) 
                Object data = args[0];
                if (data instanceof JSONObject) 
                    JSONObject json = (JSONObject) data;
                    try 
                        onMessage(json.get("content").toString());
                    
                    catch(Exception ex) 
                        Log.e(TAG, ex.getMessage());
                    
                 else 
                    onMessage(data.toString());
                

            
        ).on(com.github.nkzawa.socketio.client.Socket.EVENT_DISCONNECT, new Emitter.Listener() 

            @Override
            public void call(Object... args) 
                onDisconnect();
            
        );
        socket.connect();
    catch (Exception e)
        Log.i("Socket connection error: ", e.getMessage());
    
    //end socket connection

当我断开连接时

SocketManager类里面的断开是这样的我有这个方法

public void disconnect() 
  this.socket.disconnect();
  this.socket=null;
  SocketManager.instance = null;

谢谢

【问题讨论】:

断开套接字的实现代码会很有帮助 @jimmy0251 我更新了,我希望这更清楚一点。谢谢 您的代码看起来不错。尝试将 this.socket.off() 放在 socket.disconnect() 之前。我遇到了一个问题,即即使在 disconnect()、socket.off() 为我工作之后,服务器仍保持我的连接有效。 你在Activity的onPause()回调上调用disconnect方法对吗? @jimmy0251谢谢你的回答,现在我将尝试使用 socket.off()。但我不是在 onpause 上调用,而是手动调用,因为我的应用程序上的一个事件触发了它。 【参考方案1】:

您的代码看起来不错。尝试将 this.socket.off() 放在 socket.disconnect() 之前。我遇到了一个问题,即即使在 disconnect()、socket.off() 为我工作之后,服务器仍然保持连接处于活动状态。

【讨论】:

感谢您的回答,正如我告诉您的那样,我需要这样做,并将 nkzawa 套接字版本从 0.2.1 更新到 0.4.0。谢谢 我知道这有点晚了,但它可能会对某人有所帮助 -> 我通过结合这个答案和更新 lib to 1.0.0 解决了这个问题。干杯!

以上是关于Android Nkzawa SocketIO 断开连接并建立新连接的主要内容,如果未能解决你的问题,请参考以下文章

IOAcknowledge 方法不适用于 Android 中的 SocketIO?

Expo react-native 将无法连接到 socketio(Android 和 iOS)

如何将 Android 应用程序连接到 python-socketio 后端?

NodeJS + SocketIO android电池问题

使用 Nodejs + SocketIO 时丢弃传输错误

如何在nodejs服务器上使用android socketio模块在两个人之间进行聊天?