簡體   English   中英

Java Linux非阻塞套接字超時行為

[英]Java Linux Nonblocking Socket Timeout Behavior

我有一個Java非阻塞服務器,可以跟蹤選擇器中的所有套接字通道。 然后我建立了500個與服務器的連接並定期發送數據。 服務器接收的每條數據都會回顯給客戶端。

問題來自於測試工作幾個小時,然后所有突然間服務器正在管理的所有套接字在嘗試讀取數據時拋出一個連接超時IOException。

我已經研究過客戶端線程是否被飢餓(而不是發送數據),但我正在向客戶端線程進行迭代,該線程遍歷所有套接字並寫出數據。 交通似乎在不斷流動,但過了一段時間它才會消失。 什么可能導致這種行為?

我正在使用最新版本的Java 6在Linux平台上運行。我的應用程序啟動兩個線程,一個用於服務器,一個用於所有客戶端。 提前致謝!

額外:問題是處理Linux而不是我的代碼。 當我在Windows機器上運行完全相同的設置(在相同的硬件上)它永遠不會超時,但幾個小時后它們開始在Linux上發生。 它必須是Linux中某種導致它發生的TCP設置。 謝謝你的建議。

問題是處理Linux而不是我的代碼。 當我在Windows機器上運行完全相同的設置(在相同的硬件上)它永遠不會超時,但幾個小時后它們開始在Linux上發生。 它必須是Linux中某種導致它發生的TCP設置。 謝謝你的建議。

Java和JRE版本1.5或5.0中的-doCloseWithReadPending選項允許一個線程在另一個線程的同一套接字上有讀取掛起時關閉套接字。

當在具有來自另一個線程的未完成讀取調用的套接字上調用close()時,close()默認會阻塞套接字,直到讀取調用完成。

使用-doCloseWithReadPending選項,socket close()調用將關閉套接字,並在具有掛起讀取的線程的上下文中,拋出帶有“Socket closed”消息的SocketException。

如果沒有看到代碼,我不知道這是否是您問題的根本原因,但我想我會在此處添加此內容,因為它會影響您的問題。

因此,在有效的情況下(帶有最新JVM的Windows)和不帶有最新JVM的Linux(帶有最新JVM的Linux),服務器和客戶端都在同一個JVM中的同一台機器上?

你能澄清一下“所有的突然”是什么意思嗎? 比如,幾個小時后 - 總是相同的小時數 - 然后在幾秒鍾內所有服務器端套接字拋出異常?

您沒有提到客戶端線程讀取返回的數據。 也許它停了,你沒有注意到。 (當服務器線程遇到500個快速異常時,客戶端線程正在做什么?連續嘗試幾個堆棧轉儲以查看。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM