[英]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.