2015-10-16 23 views
2

我試圖申請this,這樣我的服務器就會告訴客戶它何時關閉。我不明白爲什麼服務器不會發射。它看起來像程序在它有機會發出之前關閉,但console.log()起作用。我認爲我的問題可能與process.on的同步性質有關,如here所述,但說實話,我不太瞭解(a)同步在這種情況下的真正含義。另外,如果有幫助,我在Windows 7上。爲什麼io.emit()在process.on()中不起作用?

// catch ctrl+c event and exit normally 
    process.on('SIGINT', function (code) { 
    io.emit("chat message", "Server CLOSED"); 
    console.log("Server CLOSED"); 
    process.exit(2); 
    }); 

我今天剛開始搞這個東西,所以原諒我的無知。任何幫助是極大的讚賞!

Full server code.

+0

'io.emit'內部可能是異步的。你可能想問問socket.io支持是否有同步版本。 – Bergi

回答

5

io.emit()是一個異步操作(可以這麼說,它在後臺運行),並由於各種TCP優化(也許如Nagle算法),您的數據可能不會立即發送。

process.exit()立即生效。

在消息成功發送並通過TCP進行確認之前,您可能會關閉應用程序,從而關閉其擁有的所有資源。

一個可能的解決方法是在稍微延遲一段時間後執行process.exit(2),使TCP堆棧有機會在關閉數據之前發送數據。

另一種可能性是避免最後一個聊天消息。客戶端很快就會看到與服務器的連接已關閉,並且無法重新連接,因此無論如何應該將該信息顯示給用戶(在服務器崩潰的情況下)。

您也可以考慮關閉Nagle算法,它會在發送數據之前嘗試等待一小段時間,以防您立即發送更多可以組合成相同數據包的數據。但是,要知道這是否可以可靠工作,您必須在適當的平臺上進行相當徹底的測試,並且有可能即使將其關閉也不能解決問題,因爲它是發送其緩衝數據的TCP堆棧之間的競爭並關閉此進程擁有的所有資源(包括開放套接字)。

相關問題