簡體   English   中英

java / groovy套接字寫入超時

[英]java/groovy socket write timeout

我有一個簡單的表現糟糕的服務器(用Groovy編寫)

ServerSocket ss = new ServerSocket(8889);
Socket s = ss.accept()
Thread.sleep(1000000)

我希望超時的客戶端(因為服務器沒有消耗它的輸入)

Socket s = new Socket("192.168.0.106", 8889)
s.setSoTimeout(100);
s.getOutputStream.write( new byte[1000000] );

但是,這個客戶端永遠阻止。 如何讓客戶端超時?

謝謝!!

您可以在其自己的線程中生成客戶端並在其上旋轉鎖定/等待(超時長)以返回。 如果Socket成功,可能使用Future對象獲取返回值。

我確實認為Socket的SO_TIMEOUT設置只影響來自套接字的read(..)調用,而不是write。

您可以嘗試使用SocketChannel (而不是Stream)並生成另一個也具有該Channel通道的線程。 另一個線程可以在阻止某個超時之后異步關閉該通道。

套接字超時是TCP級別,而不是應用程序級別。 源機器TCP正在緩沖要發送的數據,目標機器網絡堆棧正在確認收到的數據,因此沒有超時。 此外,不同的TCP / IP實現以不同方式處理這些超時。 看一下使用tcpdump (或者如果你是如此不幸的話,還是wireshark)正在發生什么:)你需要的是應用程序級別的ACK,即你需要在客戶端和服務器之間定義協議。 我不能評論Java包(你可能想看看nio ),但是通常用poll / select來處理ACK的超時。

沒有辦法獲得超時,但是如果寫入尚未完成,您總是可以生成一個關閉連接的線程。

暫無
暫無

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

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