【问题标题】:force client disconnect from server with socket.io and nodejs使用 socket.io 和 nodejs 强制客户端与服务器断开连接
【发布时间】:2011-06-30 05:06:26
【问题描述】:

有什么方法可以断开与 SocketIO 的客户端连接,并从字面上关闭连接?所以如果有人连接到我的服务器,我想关闭他们和我的服务器之间的连接,我该怎么做呢?

【问题讨论】:

    标签: socket.io


    【解决方案1】:

    编辑:现在可以实现了

    You can now simply call socket.disconnect() on the server side.

    我原来的回答:

    这还不可能。

    如果您也需要它,请在this issue 上投票/评论。

    【讨论】:

    • 所以我正在这样做,它确实会强制客户端断开连接,不幸的是,客户端似乎只是立即重新连接。我是否误解了正在发生的事情,或者这是预期的行为?
    • @kybernetikos 是的,我希望这是 - 毕竟客户可以选择自己的处理方式。通常,您想从 当前 连接中踢出另一端,比如说因为身份验证超时 - 在此之后重新连接可能甚至是可取的。
    • 那么您知道有什么方法可以告诉客户“走开,我是认真的”吗?我是从确定客户端行为不良并且不希望他们用尽我服务器上的资源的角度考虑的。
    • @ManishSapkal 您可能应该为此打开一个新问题,它不适合 cmets。
    • @Akshay 10 年后,我不再使用 socket.io;最好在他们的论坛或问题跟踪器中询问。
    【解决方案2】:

    socket.disconnect()只能用在客户端,不能用在服务器端。

    Client.emit('disconnect') 触发服务器上的断开连接事件,但没有有效断开客户端。客户端不知道断开连接。

    所以问题仍然存在:如何强制客户端与服务器端断开连接?

    【讨论】:

    • 您不必再使用最新的 socket.io 版本手动调用 Client.emit('disconnect'),现在有一个服务器端 socket.disconnect()(请参阅我的答案)。
    • 我同意,这个答案不再有效,因为现在socket.disconnect() 也可以在服务器端使用。
    • @VassilisBarzokas 如果我想要一个回调并在disconnect() 函数完成后将一些参数传递给回调怎么办?
    • 创建一组商定的消息,其中一方通知另一方他们希望断开连接,然后做您需要做的事情,然后然后真正断开连接。
    【解决方案3】:

    您为什么不能让服务器向客户端发出一条消息,使其调用断开功能?

    在客户端:

    socket.emit('forceDisconnect');
    

    在服务器上:

    socket.on('forceDisconnect', function(){
        socket.disconnect();
    });
    

    【讨论】:

    • 因为永远不能依赖客户端代码完全按照您的意愿运行。用户可以轻松修改。
    【解决方案4】:

    今天早上检查它似乎是现在:

    socket.close()
    

    https://socket.io/docs/client-api/#socket-close

    【讨论】:

      【解决方案5】:

      对于那些在谷歌上找到这个的人 - 现在有一个解决方案:

      Socket.disconnect() 踢客户端(服务器端)。客户没有机会保持联系:)

      【讨论】:

      • 如何找到服务器断线用户的socket?
      • Manish:监听socket的disconnect事件,判断是否断开。也可以是close 事件,我不太确定。有关这方面的更多信息,请参阅 socket.io 的文档。
      【解决方案6】:

      假设你的套接字的命名套接字,使用:

      socket.disconnect()
      

      【讨论】:

      • 不幸的是,这不起作用。我正在尝试从服务器端关闭与特定客户端的连接。
      【解决方案7】:

      对我不起作用

      `socket.disconnect()` 
      

      确实对我有用

      socket.disconnect(true)
      

      移交true 将关闭与客户端的底层连接,而不仅仅是客户端连接到Socket IO Documentation 的命名空间。


      一个示例用例:客户端确实使用无效的访问令牌连接到 Web 套接字服务器(访问令牌通过连接参数移交给 Web 套接字服务器)。 Web 套接字服务器通知客户端它将关闭连接,因为他的访问令牌无效:

      // (1) the server code emits
      socket.emit('invalidAccessToken', function(data) {
          console.log(data);       // (4) server receives 'invalidAccessTokenEmitReceived' from client
          socket.disconnect(true); // (5) force disconnect client 
      });
      
      // (2) the client code listens to event
      // client.on('invalidAccessToken', (name, fn) => { 
      //     // (3) the client ack emits to server
      //     fn('invalidAccessTokenEmitReceived');
      // });
      

      【讨论】:

        【解决方案8】:

        在我的情况下,我想拆除底层连接,在这种情况下,我必须调用 socket.disconnect(true),正如您从 source here 中看到的那样

        【讨论】:

          【解决方案9】:

          client._onDisconnect() 应该可以工作

          【讨论】:

          • 这非常有效.. 我维护自己的客户端映射.. 使用该映射...轻松断开客户端.. 干杯
          【解决方案10】:

          Socket.io 使用 EventEmitter 模式来断开/连接/检查心跳,这样你就可以做到。 Client.emit('disconnect');

          【讨论】:

            【解决方案11】:

            我使用client.emit('disconnect') + client.removeAllListeners() 连接客户端,以便在断开连接后忽略所有事件

            【讨论】:

              【解决方案12】:

              我在客户端使用socket.disconnect();

              client.emit('disconnect') didnt work for me
              

              【讨论】:

                【解决方案13】:

                您可以通过socket = undefined 擦除您已连接的套接字。所以想连接的时候做socket(url)

                所以它看起来像这样

                const socketClient = require('socket.io-client');
                
                let socket;
                
                // Connect to server
                socket = socketClient(url)
                
                // When want to disconnect
                socket = undefined;
                

                【讨论】:

                  【解决方案14】:

                  我在 React Native 应用程序上使用了套接字客户端,当我调用 socketIOClient.disconnect() 时,它与服务器断开连接,但是当我再次连接到套接字时,先前的事件再次连接,下面的代码通过删除所有现有事件和断开套接字连接。

                  socketIOClient.removeAllListeners();
                  socketIOClient.disconnect(true);
                  

                  【讨论】:

                    【解决方案15】:

                    从服务器端强制断开套接字

                    socket.disconnect(true)
                    

                    通过客户端事件断开套接字

                    在客户端:

                    socket.emit('forceDisconnect');
                    

                    在服务器上:

                    socket.on('forceDisconnect', function(){
                        socket.disconnect(true);
                    });
                    

                    【讨论】:

                      【解决方案16】:

                      将新的套接字连接添加到数组,然后当您想要关闭所有连接时 - 循环它们并断开连接。 (服务器端)

                      var socketlist = [];
                      
                         io.sockets.on('connection', function (socket) {
                              socketlist.push(socket);  
                              //...other code for connection here..
                         });
                      
                      
                          //close remote sockets
                          socketlist.forEach(function(socket) {        
                              socket.disconnect();                      
                          });    
                      

                      【讨论】:

                        【解决方案17】:

                        使用:

                        socket.Disconnect() //ok

                        不要使用:

                        socket.disconnect()

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 2014-01-09
                          • 2020-02-13
                          • 1970-01-01
                          • 2014-04-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2015-05-17
                          • 2018-02-09
                          相关资源
                          最近更新 更多