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

问题描述:

我正在尝试使用LearnBoost's socket.ionode-websocket-client来创建测试。客户端和服务器之间的通信很好。所有通信完成后,我关闭客户端和服务器。然而,这个程序仍在等待一些未知的回调。两个问题:如何正确关闭socket.io/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); 
}); 

编辑:改变网页套接字的变量名ws为了避免混淆

+2

对第二个问题的回答:没有工具:请参阅http://*.com/questions/5916066/node-js-tool-to-see-why-process-is-still-running – 2011-05-11 14:20:51

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

+0

socket.io正在通过http服务器监听连接。正确的关闭方式是关闭http服务器。我在测试中完成了这一步,服务器关闭了,但程序没有退出。 – Chris 2011-05-11 17:26:46

+0

如果你注释掉socket.io监听器,程序将停止在'server.close()'上。 – Detect 2011-05-11 17:52:02

+0

你在评论什么? – Chris 2011-05-11 18:06:51

var socket = io.listen(server); 

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

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

如有疑问阅读socket.io github上examples

socket.server === server它是如此它关闭你传递,在清单当然语句中的服务器。我不确定它在等什么。

+0

这是不正确的。在上面的示例中,我在客户端断开连接时关闭了服务器。上面的例子基本上是以前在socket.io中测试的一个测试的副本,特别是'tests/transports.websocket.js'。看起来Guillermo一直在改变箱子上的很多东西,所以我会检查一下他的新测试方法,看看它们是否更优雅地退出。 – Chris 2011-05-11 17:22:23

+0

@Chris没有意识到'socket.server'只是连接服务器。我认为这是不同的。 – Raynos 2011-05-11 19:20:54

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

该解决方案是棘手和bug,但工作在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); 
    }); 

希望有人能帮忙。

+0

这是断开客户端连接的正确方法,谢谢:) – ZiTAL 2012-06-02 17:13:58