2011-05-11 362 views
10

我正在嘗試使用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://stackoverflow.com/questions/5916066/node-js-tool-to-see-why-process-is-still-running – 2011-05-11 14:20:51

回答

0

該程序等待因爲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

5
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

2

在關閉所有連接並能夠運行多個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