Node Socket.io客户端在连接后认为自己已断开连接

4
我的套接字可以连接,但无法在任何方向上接收消息。我设置了如下的日志记录。在服务器端,我看到连接被记录,并在关闭页面时记录断开连接。如果我杀死服务器,客户端会记录“套接字已断开”。但是没有任何方向的发射被接收。我进行了更多的日志记录,并确定客户端套接字的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.");
  });
});
3个回答

4

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)

当我在 socket.on('connect', fn() {}); 中使用 console.log 时,我从未看到任何日志记录。我还在 io.sockets.on('connect') 的回调函数中在服务器端添加了一个 socket.emit,它必须等待连接完成后才能执行,但客户端也没有收到它。 - aaaarrgh

1
你需要在自动断开连接后重新连接。
socket.on('disconnect', function() {
   console.log("Socket disconnected.");
   socket.socket.reconnect();
});

问题在于,我似乎还没有断开连接。当我调用 socket = io.connect('http://localhost'); 时,服务器记录了一个创建连接的消息,但客户端的 socket 对象显示它没有连接。但是,当我关闭浏览器窗口时,服务器记录了一个 socket 断开连接的消息,这意味着客户端 socket 实际上已连接并发送了断开连接消息。 - aaaarrgh

1

看起来问题出在 socket = io.connect(document.URL); 上,我尝试使用 socket.io 的自动发现功能,改用 socket = io();,现在所有的传输都正常工作了。


1
请问您能详细说明哪个版本使其工作了吗? - Shimon Brandsdorfer
@ShimonBrandsdorfer 哎呀,我不知道,这是三年前做的一个兴趣项目,我已经很久没有碰它了。我的 package.json 只是将 socket.io 设置为 "latest"——所以无论在 2014 年 10 月更新到哪个版本... 抱歉! - aaaarrgh

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