如何从客户端断开和重新连接 socket.io?

Posted

技术标签:

【中文标题】如何从客户端断开和重新连接 socket.io?【英文标题】:How to disconnect and reconnect socket.io from client? 【发布时间】:2016-11-19 03:46:19 【问题描述】:

我有从服务器发送到客户端的日志消息,并且这些消息始终来自服务器并记录到客户端,现在我有额外的功能来停止和播放日志以向用户提供一些控制,所以我正在考虑停止断开socket.io 连接并再次开始播放socket.io 连接,首先我尝试停止断开连接但我无法向服务器发送消息,知道下面的代码有什么问题或任何更好的解决方案来完成这些任务? main.html

<button type="button" class="btn btn-success" ng-click="stopLogs()">stop</button>

ctrl.js

$scope.stopLogs = function()
        socket.emit('end');
    

angularSOcketFactory.js

angular.module('App').factory('socket', function ($rootScope) 
    'use strict';
        var socket = io.connect('http://localhost:3000');
        return 
            on: function (eventName, callback) 
                socket.on(eventName, function () 
                    var args = arguments;
                    $rootScope.$apply(function () 
                        callback.apply(socket, args);
                    );
                );
            ,
            emit: function (eventName, data, callback) 
                socket.emit(eventName, data, function () 
                    var args = arguments;
                    $rootScope.$apply(function () 
                        if (callback) 
                            callback.apply(socket, args);
                        
                    );
                )
            
        ;

);

server.js

var io = require('socket.io')(server);
  io.sockets.on('connection',function()
   // Producer.startProducer();
    ditconsumer.start(function(value)
        io.emit('ditConsumer',value)
    );
    io.sockets.on('end', function() 
        socket.disconnect();
        console.log('it will disconnet connection');
    );
);

【问题讨论】:

【参考方案1】:

这段代码是错误的:

io.sockets.on('end',function () 
console.log('this will disconnet socket connection');
 io.sockets.disconnect();
);

您需要将该事件侦听器应用于一个特定的套接字,然后您需要断开一个特定的套接字。

您不会显示服务器代码的一般上下文,但可以这样做:

io.on('connection', function(socket) 
    socket.on('end', function() 
        socket.disconnect();
    );
);

您也可以让客户端直接断开连接,而不是要求服务器为您完成。

【讨论】:

我更新了我的问题以便从服务器端更好地理解,但这里的问题是当我点击 stopLogs() 方法时它甚至没有从客户端发出消息。 @hussain - 好吧,您的服务器代码仍然错误,需要更正。 io.sockets.on(...) 是错误的,应该是 socket.on(...)。我不知道角度,所以如果那里确实存在问题,我会把它留给其他人。 socket.on('end') is throwing exception socket is not defined 我试过io.on('end')同样的结果。 @hussain - 仔细查看我的推荐代码。您可能没有像我的答案中的代码那样向事件处理程序声明套接字参数。在我的回答中查看function(socket) 的位置。这就是您获得新连接的socket 的方式,这就是您应该操作的方式。 我可以通过socket.connect() 重新连接吗?

以上是关于如何从客户端断开和重新连接 socket.io?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测Socket IO中的重新连接事件

Socket io客户端在react-native应用程序中不断断开和重新连接

Socket.io 客户端在突然断开连接后无法重新连接到服务器

如何检测 socket.io 上的断开连接?

socket.io 服务器在注册客户端断开连接时非常延迟

如何在 Socket.IO 中模拟连接失败