14

我正在尝试使用LearnBoost 的 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以避免混淆

4

3 回答 3

6
var socket = io.listen(server);

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

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

如有疑问,请阅读socket.iogithub示例

socket.server === server它是您传入的服务器,在 liste 语句中,因此它已关闭。我不确定它在等什么。

于 2011-05-11T16:45:45.550 回答
3

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

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

目前,在 socket.io 上,OS 贡献者已经修补了websocket 客户端。因此,我们必须在我们的 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);
  });

希望,有人可以帮忙。

于 2011-10-18T14:31:12.950 回答
0

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

于 2011-05-11T16:42:04.410 回答