2013-06-04 28 views
0

我讀了很多有關,但的NodeJS仍不清楚以下:nodejs如何維護多個併發連接?

  • 使用TCP協議的客戶端和服務器同意在一個端口上,然後可以保持連接。服務器知道客戶端的IP地址,因此可以發回消息。如果我們使用nodejs,那麼多個客戶端可以連接到相同端口上的同一個nodejs服務器。這怎麼可能?同一臺服務器如何在同一端口上建立多個連接。
  • 如果客戶端在NAT後面,那麼它的IP可以是動態的,那麼nodejs服務器如何可以向客戶端發送數據。
  • 在維護服務器和客戶端上的持久連接時,資源使用情況如何?
  • nodejs服務器崩潰時發生了什麼?客戶端如何再次啓動連接?
  • 如果客戶端存在網絡問題,並且每隔5分鐘終止並啓動連接,那麼這種情況是否可以處理?

回答

4

使用TCP協議的客戶端和服務器同意在一個端口上,然後可以維持connection.Server知道客戶端的IP地址,從而可以發送回messages.If我們用那麼的NodeJS多個客戶端可以連接到相同的NodeJS服務器在同一端口上。這怎麼可能?同一臺服務器如何在同一端口上建立多個連接。

沒有限制,其可以在一個端口上可以保持(儘管在實踐中,有可能是操作系統或硬件限制)連接的數量。當然,只有一個進程可以監聽端口,但這與連接無關。這不是特定於節點的,所有的TCP服務器都是這樣工作的。

如果客戶端在NAT後面,那麼它的IP可以是動態的,那麼nodejs服務器如何發送數據給客戶端。

你實質上是在問NAT如何工作。同樣,在這種情況下,沒有任何特定節點。 NAT服務器根據需要簡單地更改數據包標頭,並維護用於路由的轉換表,就像使用任何連接一樣。

會有什麼在維持服務器和客戶端

開銷持久連接的資源利用率是真的只是連接本身相當小。一點點的記憶,但在大局中幾乎沒有意義。如果您要爲每個連接存儲更多關聯數據,則可能會有所不同。 Node.js很好地處理了大量的併發連接,但是如果你擔心的話,你總是可以搜索基準測試,或者編寫自己的測試。

nodejs服務器崩潰時發生了什麼?客戶端如何再次發起連接?

插座同時發出closeerror事件。只是傾聽他們的意見,然後嘗試重新連接,可能會造成延遲。

如果在客戶端的網絡問題,它結束並開始每5分鐘後連接..then有沒有辦法這種情況下可以辦理?

不完全知道你是問這裏。客戶只需按照上一個問題/答案中的說明重新連接即可。如果你的某些數據與客戶關聯插座,以及你想有一個寬限期,其中客戶端有一個機會,數據之前重新連接被釋放,那麼你就需要設置一個超時一定量後,將釋放這些資源的時間。然後,在連接偵聽器中,或者在一個身份驗證事件中,您需要分析新連接以查看它是否與最近斷開連接的客戶端相匹配。

我一定會推薦看socket.io,尤其是如果你的用例是基於網絡的,儘管它不僅僅用於瀏覽器/服務器連接。它會或多或少地自動執行許多您似乎關心的事情(重新連接,資源關聯,斷開寬限期等)。

0

TCP連接保持開放汽車無。通過客戶端不必連續從服務器以長池方式刷新來實現保存,以便檢查服務器上是否存在任何新消息,例如AJAX。在服務器,代理和路由器上,客戶端每隔幾秒鐘創建一個新連接以重新從服務器刷新。如果Node.js連接保持打開狀態,但在客戶端或服務器有要發送的內容之前它不會處於活動狀態。在這裏找到好文章http://www.html5rocks.com/en/tutorials/websockets/basics/

想象一下擁有1000個聊天客戶端,每個客戶端每3秒詢問一次新消息是否到達。這導致服務器上每分鐘有2000個請求和響應。如果Node.js服務器僅在有消息要發送時纔會向客戶端發送消息,同時所有1000個連接都將處於空閒狀態,但將保持打開狀態。

TCP連接始終在同一端口(如端口80)上啓動,但通信在打開時分配給每個連接的不同端口上進行維護。所以你仍然需要保持連接不斷開放,但是你不必像以前那樣不斷地發送聯合消息。