Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 套接字io在重新连接时连接到多个套接字_Javascript_Node.js_Events_Redis_Socket.io - Fatal编程技术网

Javascript 套接字io在重新连接时连接到多个套接字

Javascript 套接字io在重新连接时连接到多个套接字,javascript,node.js,events,redis,socket.io,Javascript,Node.js,Events,Redis,Socket.io,我有一个应用程序,其中我使用NodeJS、socket io和redis实现了通知 在这里,我已经成功地在NodeJS中配置了发布服务器和订阅服务器。使用socket io,我可以在客户端实时显示消息 我的设计是1出版商发布到许多频道,每个用户只听自己的频道 我发布到channel1和channel2,由于用户只收听他们的频道,他们只收到各自的消息一次 到目前为止,它工作得很好,很顺利 但我的问题开始了。当互联网离线时,它会尝试重新连接,当它再次建立连接时,在每次发布时,它都会开始订阅两次,因此

我有一个应用程序,其中我使用NodeJS、socket io和redis实现了通知

在这里,我已经成功地在NodeJS中配置了发布服务器和订阅服务器。使用socket io,我可以在客户端实时显示消息

我的设计是1出版商发布到许多频道,每个用户只听自己的频道

我发布到channel1和channel2,由于用户只收听他们的频道,他们只收到各自的消息一次

到目前为止,它工作得很好,很顺利

但我的问题开始了。当互联网离线时,它会尝试重新连接,当它再次建立连接时,在每次发布时,它都会开始订阅两次,因此messeges会显示两次

我的代码在服务器订户端类似于此

io.sockets.on('connection', function (socket) {
    var channelName = "channel"+socket.handshake.query.ch;
    console.log("=======================================================================");
    console.log("Connected to client - ["+socket.id+"] for ["+channelName+"]");
    console.log("Transport Method - ["+io.transports[socket.id].name+"]");
    console.log("=======================================================================");

    try{
        var client = redis.createClient();
        client.on("connect",function(){
            client.subscribe(channelName)?console.log("channel subscribed to {"+channelName+"}"):console.log("Not Subscribed to {"+channelName+"}");
            client.on("message", function(channel,message){
            console.log("=======================================================================");
            console.log("Got message ["+message+"] in ["+channel+"]");
            socket.emit("notification"+channel, { msg: message });
            console.log("=======================================================================");
            });
        });
    }catch(e){
        console.log("Redis server is not running !!");
    }

    socket.on('disconnect', function(){
    console.log("Disconnected From client !!");
    });
});
在客户端,我的代码是这样的

<script src="localhost:3000/socket.io/socket.io.js"></script>
<script>

    // For one client ch=1 and for another ch=2
    var socket = io.connect("localhost:3000",{ query: "ch=1", "try multiple transports":false});
    socket.on('connect', function(data){
        $("div#status").html("<div class='connected'></div><span>connected</span>");
    });

    // For one client event is notificationchannel1 and for another client event is notificationchannel2
    socket.on('notificationchannel1',function(data){
        $("div#notification-div").append(data.msg);
    });
    socket.on('connecting', function(data){
        $("div#status").html("<div class='connecting'></div><span>connecting</span>");
    });
    socket.on('disconnect', function(data){
        $("div#status").html("<div class='disconnected'></div><span>disconnected</span>");
    });
    socket.on('reconnecting', function(data){
        $("div#status").html("<div class='reconnecting'></div><span>reconnecting...</span>");
    });          
</script>

//对于一个客户机ch=1,对于另一个客户机ch=2
var socket=io.connect(“localhost:3000”,{query:“ch=1”,“尝试多个传输”:false});
socket.on('connect',函数(数据){
$(“div#status”).html(“已连接”);
});
//对于一个客户端事件,是notificationchannel1;对于另一个客户端事件,是notificationchannel2
socket.on('notificationchannel1',函数(数据){
$(“div#notification div”).append(data.msg);
});
socket.on('connecting',函数(数据){
$(“div#status”).html(“连接”);
});
socket.on('disconnect',函数(数据){
$(“div#status”).html(“断开连接”);
});
socket.on('重新连接',函数(数据){
$(“div#status”).html(“重新连接…”);
});          

请告诉我我遗漏了什么。

@user568109链接中的问题与此问题有何关联?抱歉,这是正确的链接是的,但如果我这样做,那么此重新连接将如何工作?因为如果我写iosocket.once('connect',function(){})而不是iosocket.on('connect',function(){}),那么我将只连接,而重新连接将不起作用。