【问题标题】:How does one properly shutdown socket.io / websocket-client?如何正确关闭 socket.io / websocket-client?
【发布时间】:2018-05-29 06:05:44
【问题描述】:

我正在尝试使用LearnBoost's socket.ionode-websocket-client 创建一个测试。客户端和服务器之间的通信工作得很好。完成所有通信后,我关闭了客户端和服务器。然而程序挂起,等待一些未知的回调。两个问题:

  1. 以下程序在等待什么?
  2. 是否有诊断节点程序中未完成回调的工具?

var connect = require('connect'),
    io = require('socket.io'),
    WebSocket = require('websocket-client').WebSocket;

var port = 7111;

var server = connect.createServer();

var socket = io.listen(server); 
socket.on('connection', function(client) {
  client.send('Welcome!');

  client.on('message', function(message) {
    console.log(message);
  });

  client.on('disconnect', function() {
    console.log('closing');
    server.close();
  });
});

server.listen(port, function() {
  var ws = new WebSocket('ws://localhost:' + port + '/socket.io/websocket');
  ws.onmessage = function(message) {
    console.log(message.data);
  };

  setTimeout(function() {
    ws.send('~m~3~m~Yo!');
    ws.close();
  }, 10);
});

编辑:将 WebSocket 的变量名更改为 ws 以避免混淆

【问题讨论】:

标签: node.js socket.io


【解决方案1】:
var socket = io.listen(server);

您已经在端口上创建了一个套接字。你从来没有关闭过它。

socket.server.close() 关闭您的 (socket.io) 套接字。

如有疑问,请阅读socket.io github examples

socket.server === server 这是你传入的服务器,在 liste 语句中,所以它被关闭了。我不确定它在等什么。

【讨论】:

  • 这是不正确的。在上面的示例中,我在客户端断开连接时关闭了服务器。上面的示例基本上是以前在 socket.io 中的一个测试的副本,特别是 tests/transports.websocket.js。看起来 Guillermo 已经在后备箱上更改了很多东西,所以我会检查一下他的新测试方法,看看它们是否更优雅地退出。
  • @Chris 没有意识到 socket.server 只是连接服务器。我认为这是不同的东西。
【解决方案2】:

下面是一种关闭所有连接并能够运行多个 expresso 测试的方法(使用 socket.io 和 socket.io-client)。

该解决方案很棘手且有问题,但适用于 0.8.5。主要问题是关于使用 websockets 的库(node-websocket-client)。

目前,在 socket.io 上,操作系统的贡献者已经修补了websocket client。因此,我们必须在我们的 socket.io-client npm 包上执行相同的操作,以便能够在套接字客户端使用 finishClose 方法。 Socket.io-client 使用 websocket 库作为 npm 包,因此您必须找到文件 (websocket.js) 并在 socket.io 上将其替换为相同的文件。

之后,您可以使用 finishClose 方法确保连接已关闭,并使用一些自定义服务器/客户端套接字设置,测试将正确运行。

  var  io = require("socket.io").listen(port);

  io.set('close timeout', .2);
  io.set('client store expiration', .2);

  var client = require("socket.io-client").connect( "http://localhost", { port: port ,  'reconnect': false, 'force new connection': true});

  client.on('connect', function() {

        client.disconnect();

  });

  client.on('disconnect', function() {

      client.socket.transport.websocket.finishClose();
      io.server.close();

  });

  io.server.on('close', function() {

      setTimeout( function() {

        done();

      }, 500);
  });

希望有人可以帮忙。

【讨论】:

    【解决方案3】:

    程序正在等待,因为 socket.io(服务器)仍在侦听传入连接。我不知道有什么方法可以停止听。

    【讨论】:

    • socket.io 正在通过 http 服务器监听连接。关闭的正确方法是关闭 http 服务器。我在测试中做了这个,服务器关闭了,但是程序没有退出。
    • 如果你注释掉socket.io监听器,程序会在server.close()停止。
    • /*var socket = io.listen(server); socket.on('connection', function(client) { client.send('Welcome!'); client.on('message', function(message) { console.log(message); }); client.on('disconnect', function() { console.log('closing'); server.close(); }); });*/ 然后在ws.close() 后面加上server.close()
    猜你喜欢
    • 1970-01-01
    • 2018-08-21
    • 2012-02-17
    • 2011-06-16
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多