如何正确关闭socket.io / websocket-client?

时间:2011-05-11 14:17:35

标签: node.js socket.io

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

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

  3. 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以避免混淆

3 个答案:

答案 0 :(得分:5)

var socket = io.listen(server);

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

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

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

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

答案 1 :(得分: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);
  });

希望,有人可以提供帮助。

答案 2 :(得分:0)

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