【问题标题】:Node Socket.io client thinks it is disconnected after it has connectedNode Socket.io 客户端连接后认为断开连接
【发布时间】:2014-12-16 09:54:18
【问题描述】:

我的套接字将连接,但无法从任一方向接收消息。我设置了如下所示的日志记录。在服务器端,我看到正在记录连接,并在页面关闭时记录了断开连接。如果我终止服务器,客户端会记录“套接字已断开连接”。但是没有接收到任何一个方向的排放。我做了更多的日志记录并确定客户端套接字的socket.connected 字段是false

在这一点上,我完全不知所措。从字面上看,只要我建立连接,客户端就会认为它的套接字已断开连接,但是当我关闭浏览器窗口时,服务器仍然会看到它断开连接。我正在运行 socket.io 1.1.0。感谢您的帮助!

服务器:

io.sockets.on('connection', function(socket) {
  logger.info('Socket connected. ID: ' + socket.id);

  socket.on('refresh', function() { 
    logger.info('Refresh received from ID: ' + socket.id);
  });
  socket.on('disconnect', function() { 
    logger.info('Disconnect received from ID: ' socket.id);
  });
});

客户:

var socket;
$(document).ready(function() {
  socket = io.connect('http://localhost');
  console.log(socket.connected);

  socket.emit('refresh');

  socket.on('disconnect', function() {
    console.log("Socket disconnected.");
  });
});

【问题讨论】:

    标签: node.js sockets socket.io


    【解决方案1】:

    io.connect 之后没有立即连接套接字。你必须等待:

    var socket;
    $(document).ready(function() {
      socket = io.connect('http://localhost');
    
    
      socket.on('connect', function () {
        console.log(socket.connected);
        socket.emit('refresh');
      });
    
      socket.on('disconnect', function() {
        console.log("Socket disconnected.");
      });
    });
    

    更多活动:http://socket.io/docs/client-api/#manager(url:string,-opts:object)

    【讨论】:

    • 当我在console.logsocket.on('connect', fn() {}); 时,我从来没有看到任何记录。我还在io.sockets.on('connect') 的回调内的服务器端添加了一个socket.emit,它必须等到连接完成后,客户端也不会收到。
    【解决方案2】:

    自动断开后需要重新连接

    socket.on('disconnect', function() {
       console.log("Socket disconnected.");
       socket.socket.reconnect();
    });
    

    【讨论】:

    • 问题是,我似乎还没有断开连接。当我调用socket = io.connect('http://localhost'); 时,我看到服务器记录的连接已创建消息,但客户端的套接字对象说它未连接。但是当我关闭浏览器窗口时,服务器记录了一个套接字断开消息,暗示客户端套接字实际上已连接,并发送了一个断开消息。
    【解决方案3】:

    看起来问题出在socket = io.connect(document.URL); 我尝试通过socket = io(); 使用socket.io 自动发现,现在我的所有排放都正常工作。

    【讨论】:

    • 能否详细说明是哪个版本使它工作的?
    • @ShimonBrandsdorfer 哎呀我不知道,这是 3 年前的一个爱好项目,我很久没有接触过。我的 package.json 只是将 socket.io 设置为“最新”——所以 2014 年 10 月的任何版本都是最新的......对不起!
    猜你喜欢
    • 2017-07-17
    • 1970-01-01
    • 2012-10-12
    • 2021-07-22
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2013-03-28
    相关资源
    最近更新 更多