重新连接到我的 socket.io 服务器后,没有收到从我的 android 设备发送的事件

Posted

技术标签:

【中文标题】重新连接到我的 socket.io 服务器后,没有收到从我的 android 设备发送的事件【英文标题】:After reconnecting to my socket.io server does not receive the event sent from my android device 【发布时间】:2020-11-22 17:33:05 【问题描述】:

我真的看不出有什么问题,在安卓手机上,我连接到我的服务器节点 js socket.io,所有事件都正常工作。但是如果我切断连接并重新激活它。服务器检测到重新连接。但是从手机发送到服务器的事件,服务器并没有收到。

我创建了一个带有允许重新连接的参数的套接字:

private Socket socket;

    try 
        IO.Options opts = new IO.Options();
        opts.forceNew = false;
        opts.reconnection = true;
        opts.reconnectionAttempts = Integer.MAX_VALUE;
        opts.reconnectionDelay = 1000;
        opts.reconnectionDelayMax = 5000;
        socket = IO.socket(Constant.URL_SOCKET, opts);
     catch (URISyntaxException e) 
        e.printStackTrace();
    

显然我没有忘记调用 onCreate :

socket.connect();
actionSocket();

这里我的监听器也调用 onCreate :

    socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() 
        @Override
        public void call(Object... args) 
            actionSocket();
        
    );
    socket.on(Socket.EVENT_RECONNECT, new Emitter.Listener() 
        @Override
        public void call(Object... args) 
            actionSocket();
        
    );

actionSocket对应这个函数:

 socket.on("toast", new Emitter.Listener() 
        @Override
        public void call(Object... args) 
             runOnUiThread(new Runnable() 
                 @Override
                 public void run() 
                    Toast.makeText(MainActivity.this, "Toast", Toast.LENGTH_SHORT).show();
                 
             );
        
    );

为了测试重新连接,我得到了这个按钮:

button.setOnClickListener(new View.OnClickListener() 
    @Override
    public void onClick(View v) 
        socket.emit("toast", new JSONObject());
    
);

服务器端:

io.on('connection', function(socket)
    console.log("connection");
    addSocketListeners(socket);
);

还有 addSocketListeners()

function addSocketListeners(socket)
    socket.on("toast", function(data)
         socket.emit("toast", );
    );

希望我的问题很清楚。感谢所有帮助我的人。

【问题讨论】:

真的可以重新连接套接字吗?还是你创建了一个新的套接字? 不,我不是在创建一个新实例,重新连接确实是可能的。 【参考方案1】:

试试这个:

off断开socket时的事件和on每次连接时的事件

socket.off("toast");

编辑:使用 removeAllListeners 代替关闭:

io.on('connection', function(socket)
    socket.on("disconnect", function()
        socket.removeAllListeners("toast");
    );
);

【讨论】:

我正在尝试,请稍等 这项工作与 removeAllListeners("toast"),谢谢!

以上是关于重新连接到我的 socket.io 服务器后,没有收到从我的 android 设备发送的事件的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io - nodejs 服务器端。重新连接后传输关闭

socket.io 不工作,我的颤振应用程序没有连接到服务器或后端部分

Socket.io 不会按需关闭套接字(并且不允许我的 swift 应用程序再次重新连接到 node.js 服务器)

socket.io javascript客户端在重新启动服务器后无法重新连接

Swift iOS 应用程序不使用 Socket.IO 连接到服务器

如何从 Vue.js 组件连接到 socket.io?