我需要定期與plc通信(每1秒),我發送消息並收到消息。我使用Socket
類來進行此通信。我是否需要每隔1秒打開一次連接(socket=new Socket(ipaddress, port)
),發送消息socket.close()
等等,還是一直保持套接字操作?套接字在1秒內打開和關閉或保持打開
回答
我假設你在這裏討論的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套接字...
您可以擁有永久連接的客戶端,其中客戶端始終連接到服務器。但是這種方法的性能取決於服務器的實現方式。如果它使用線程模型(每個客戶端連接一個線程),則在處理大量客戶端連接時可能會發現資源耗盡。如果您的服務器使用基於事件的方法來處理請求,只要「計算」不是很長時間,那麼您應該很好地採用永久客戶端方法。
與往常一樣,基於您的用例的基準和您應該很好去。
保持套接字始終連接將減少客戶端的網絡流量和計算時間。但是,如果服務器使用阻塞I/O,如果許多客戶端仍處於連接狀態,它可能會用盡連接線程。由於超時,網絡問題和服務器停機時間,您還必須處理丟棄的連接。
- 1. Golang在關閉後保持文件服務套接字打開
- 2. 如何在客戶端關閉前保持套接字打開?
- 3. 關閉以前打開的套接字
- 4. 保持java套接字打開?
- 5. Java readline()保持套接字打開
- 6. IPC:爲每個請求連接或保持套接字打開?
- 7. 爲什麼我應該關閉或保持Redis連接打開?
- 8. UISwitch 0/1打開/關閉
- 9. 關閉MessageBox但保持窗體打開
- 10. C#套接字 - 如何保持套接字打開?
- 11. 意外套接字有時會關閉(或不打開)
- 12. MYSQL /打開和關閉連接或保持每個瀏覽器用戶打開一個連接?
- 13. 套接字始終打開或只是在需要時打開?
- 14. 打開或關閉分組
- 15. 打開/關閉ADO連接
- 16. Javascript:打開/關閉開關
- 17. 打開和關閉或返回,如果已經打開導航
- 18. 保持mysql連接打開
- 19. 如何打開usercontrol並關閉2秒
- 20. 在子進程中關閉打開的套接字
- 21. Rabbit MQ python腳本。連接打開時套接字關閉
- 22. 關閉popover外彈出,但內部保持打開
- 23. 保持在Android應用程序上打開套接字
- 24. 調用單例類來保持套接字連接打開
- 25. Java套接字:如何在發送文件後保持套接字「打開」?
- 26. 關閉和打開數據庫連接?
- 27. 打開和關閉連接到SQL Server
- 28. 打開和關閉連接跟蹤
- 29. 多次打開和關閉mysql連接
- 30. XCDYouTubeVideoPlayer打開和關閉