2011-02-02 45 views
4

我需要定期與plc通信(每1秒),我發送消息並收到消息。我使用Socket類來進行此通信。我是否需要每隔1秒打開一次連接(socket=new Socket(ipaddress, port)),發送消息socket.close()等等,還是一直保持套接字操作?套接字在1秒內打開和關閉或保持打開

回答

8

我假設你在這裏討論的TCP套接字...

從參與建立TCP連接的明顯低效率

除了每一秒你也很可能落得積累插座,TIME_WAIT(希望在你的客戶端)。

我已經寫TIME_WAIT和問題,它關於服務器可擴展性和穩定性,在這裏我的博客的原因:http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html

鑑於率要打開和關閉套接字(每秒一次將導致240 (60 * 4)套接字在正常(4分鐘)2MSL TIME_WAIT期間坐在TIME_WAIT)假設TIME_WAIT套接字在客戶端而不是在服務器上,假設你是沒有每秒鐘連接到大量服務器,但是......如果你有很多客戶端每秒連接到你的服務器,並且你不確定你的服務器沒有在中累積套接字狀態,那麼你可能會限制你的服務器的可擴展性。

另一種方法是保持套接字連接處於打開狀態,並且只有在中斷連接時才重新打開它。這對於你初始編程來說可能會稍微複雜一點,但以這種方式集中連接可能會更有效率(當你需要發送數據時,你只需發送數據,而不需要通過TCP握手設置連接)以及客戶端上更高效的資源;你不是永遠持有在TIME_WAIT 240套接字...

3

您可以擁有永久連接的客戶端,其中客戶端始終連接到服務器。但是這種方法的性能取決於服務器的實現方式。如果它使用線程模型(每個客戶端連接一個線程),則在處理大量客戶端連接時可能會發現資源耗盡。如果您的服務器使用基於事件的方法來處理請求,只要「計算」不是很長時間,那麼您應該很好地採用永久客戶端方法。

與往常一樣,基於您的用例的基準和您應該很好去。

4

保持套接字始終連接將減少客戶端的網絡流量和計算時間。但是,如果服務器使用阻塞I/O,如果許多客戶端仍處於連接狀態,它可能會用盡連接線程。由於超時,網絡問題和服務器停機時間,您還必須處理丟棄的連接。