如何在客户端断开并重新连接socket.io?

3

我有一些来自服务器的日志信息,它们持续地从服务器传递到客户端并记录到客户端中。现在我需要添加额外的功能,以便停止和播放这些日志,以提供给用户一些控制。因此,我考虑在停止时断开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个回答

8
这段代码有误:
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
@hussain - 嗯,你的服务器代码仍然有误,需要进行更正。io.sockets.on(...)是错误的,应该是socket.on(...)。我不懂Angular,如果那里真的有问题,我会把它留给其他人处理。 - jfriend00
socket.on('end') 抛出异常,提示 socket 未定义。我尝试使用 io.on('end'),但结果相同。 - hussain
我可以使用 socket.connect() 重新连接连接吗? - hussain
@hussain - 只有客户端可以重新连接。服务器无法直接连接到浏览器客户端。浏览器连接到服务器。 - jfriend00
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接