我有兩個Java應用程序之間的套接字tcp連接。當一側關閉插座時,另一側保持打開狀態。但我希望它被關閉。我也等不及看它是否可用,然後關閉它。我想要某種方式從一側完全關閉它。 我能做什麼?是否可以關閉客戶端和服務器端的Java套接字?
回答
TCP不能像這樣工作。即使TCP堆棧知道另一端關閉它,操作系統也不會釋放資源,即文件描述符和端口,直到應用程序明確關閉套接字或死亡。在從對等端收到FIN時,從內核到用戶應用程序沒有回調。操作系統向對方確認,但在發送其FIN數據包之前等待應用程序調用close()
。看看TCP state transition diagram - 你在被動關閉框。
檢測這種情況的一種方法是在不爲每個套接字指定線程的情況下使用select/poll/epoll/kqueue
函數系列。被動關閉的套接字將被標記爲可讀,讀取嘗試將返回EOF。
希望這會有所幫助。
如果您仍然從您的套接字讀取數據,那麼您將在關閉時檢測-1。
如果您不再讀取套接字,請繼續並關閉它。
如果它們都不是這些,你可能有一個線程等待一個事件。這不是您想要處理數千個端口的方式! Java會開始在Windows的大約3000個線程中獲取pukey - 在Linux中更少(我不知道爲什麼)。
確保您使用的是NIO。使用單個線程來管理您的所有端口(連接池)。它應該只抓取線程中的數據,並將其轉發到隊列中。在那一點上,我想我會有一個線程池將數據從隊列中取出並處理它,因爲實際處理來自端口的數據需要一些時間。
將線程連接到每個端口將不起作用,並且是需要NIO的最大原因。另外,將某種「關閉」消息作爲觸發關閉端口的流的一部分可能會使事情工作更快 - 但仍然需要處理-1來覆蓋破碎流的情況
通常的解決方案是讓對方知道你要在關閉連接之前關閉連接。例如,在SMTP協議的情況下,服務器在關閉連接之前將發送'221 Bye'。
儘管這是一個很好的優化,但它不會處理丟失的連接,並最終會堆積開放的端口。在有數千個端口打開的系統中這是不可接受的,但它確實減少了「我可以關閉此端口」掃描的頻率。 – 2010-01-30 01:31:04
- 1. Netty - 是否關閉客戶端的套接字關閉服務器的通道
- 2. 同時關閉服務器和客戶端套接字連接
- 3. Java客戶端服務器「套接字已關閉」
- 4. Java套接字 - 關閉到服務器套接字的telnet客戶端連接
- 5. 套接字java客戶端服務器
- 6. Java套接字客戶端/服務器
- 7. java:關閉客戶端套接字重置服務器套接字
- 8. 關於檢查客戶端是否從服務器套接字
- 9. 由於關閉套接字,服務器回覆客戶端消息失敗 - Java客戶端 - 服務器示例
- 10. C套接字服務器,Java套接字客戶端:阻塞!
- 11. Python套接字客戶端到Java套接字服務器
- 12. php套接字服務器檢查客戶端是否連接
- 13. 服務器套接字只在客戶端套接字關閉後打印
- 14. 服務客戶端在perl後套接字連接關閉
- 15. PHP套接字服務器/客戶端
- 16. 客戶端服務器udp套接字
- 17. 客戶端 - 服務器套接字
- 18. 服務器/客戶端套接字
- 19. 客戶端服務器套接字C#
- 20. Python服務器客戶端套接字
- 21. 無法連接Java套接字服務器和客戶端
- 22. 我無法關閉服務器和客戶端之間的套接字連接
- 23. Java套接字。服務器端與客戶端通訊
- 24. Java客戶端/服務器套接字端口分配
- 25. 套接字客戶端是否可以關閉連接並且服務器不知道?
- 26. Java客戶端和帶有套接字的PHP服務器
- 27. 客戶端和服務器的Java套接字問題
- 28. C++檢測客戶端是否關閉連接(多套接字)
- 29. java套接字服務器和套接字客戶端之間的連接
- 30. Java TCP客戶端和C#服務器;客戶端只接收服務器關閉後的消息
TCP狀態轉換圖鏈接給出了404 – 2015-06-12 14:11:03