【问题标题】:Using Socket.io, connections keep dropping使用 Socket.io,连接不断下降
【发布时间】:2016-07-29 18:32:28
【问题描述】:

我正在使用 Socket.io 在电话和网页之间进行一些通信,但我遇到了服务器不断断开连接的问题。我看到很多其他人发布关于 Socket.io 的帖子,他们的连接在空闲大约 5 分钟左右后断开,但这是一个不断发出来回信息的连接,也是我最长的连接能够保持连接大约需要 30 秒。

我正在运行的服务器端代码是:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

io.on('connection', function(socket){

    socket.on('create', function (room) {
        socket.join(room);
    });

    socket.on('player-move', function(msg){
        roomId = msg['room'];
        move = msg['action'];
        socket.broadcast.to(roomId).emit('player-move', move);
    });

    socket.on('disconnect', function() {
        console.log('someone has disconnected');
    });

});

http.listen(443, function(){
  console.log('listening on *:443');
});

客户端是非常基本的发射事件。这是一个例子:

$( "#arrow-left" ).on( "touchstart", function(){
    var senddata = { "room": roomId, "action": "d-l" };
    socket.emit( "player-move", senddata );
});

一切似乎都运行良好,直到一切开始后 5-30 秒,然后连接才断开。连接通常会在 5-10 秒后重新启动。有没有人遇到过类似的问题?这可能是服务器而不是代码的问题吗?我以前用 Socket.io 在不同的服务器上做过类似的事情,并且没有遇到过这种连接问题。任何帮助或方向将不胜感激。谢谢!

【问题讨论】:

  • 您的服务器的var 声明在哪里? roomId = move = 将在非严格模式下在全局范围内定义这些变量,并在严格模式下彻底崩溃您的服务器。客户在哪里得到roomId?如果它未定义,也可能会导致服务器崩溃,因为您基本上是在告诉服务器运行socket.broadcast.to(undefined).emit(...);
  • 客户端和服务器之间是否有任何可能导致套接字超时的基础设施?您确定您的服务器一直在运行而不是重新启动吗?
  • 您确定他们正在断开连接吗?连接也可能会退回到长轮询而不是持久连接,这可能由于多种原因而发生,并且看起来像是未连接。
  • 我很确定它正在断开连接。每次出现问题时,控制台都会记录“有人已断开连接”。只是为了覆盖我的基地,我关闭了手机上的 wifi,但问题也发生在其他人身上。我还继续确保在该函数的范围内声明了 roomId 和 move 变量。我不知道答案是哪一个,但它似乎不再断开连接。

标签: node.js websocket socket.io


【解决方案1】:

我在另一个名为ws 的库中遇到了同样的问题,我尝试通过删除从一组客户端发送断开连接请求的特定客户端来正确处理断开连接方法。我不完全知道如何,但它解决了我的问题。

clients = []

io.on('connection', function(socket){
    clients.push(socket);

    // above methods

    socket.on('disconnect', function(){
        console.log("disconnected");
        deleteFromArray(clients, socket.id);

    });
});

function deleteFromArray(arr, element) {
  position = arr.indexOf(element);
  arr.splice(position, 1);
}

【讨论】:

  • 这个答案没有意义。
  • 好吧!我不是专家,我在 4 年前就已经回答过了。它对我有用。我现在也不记得了。如果你找到了一个好的答案,那么你可以分享给大家。
猜你喜欢
  • 2020-07-07
  • 2018-07-30
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多