2010-06-10 53 views
1

我試圖創建一個小的HTTP代理,可以根據需要重新編寫請求/標頭以適應我的要求。如果已經存在,請將它指向我。否則...Java/Groovy Socket - 檢測以非阻塞方式關閉的套接字

我寫了一些東西,幾乎工作。它可以做代理功能,但不能重寫(還)。問題是,我無法檢測到遠程套接字何時未被阻塞讀取而關閉。對於這個東西的功能來說它是關鍵的,它能夠檢測到沒有阻塞的插座被關閉。我已經清理了Java API文檔,我找不到任何跡象表明它甚至是可能的。以下是我所擁有的:

while (this.inbound.isConnected() && this.outbound.isConnected()) { 

     try { 
     while ((available = readFromClient.available()) != 0) { 
      if (available > 1024) available = 1024 
      bytesRead = readFromClient.read(buffer, 0, available) 
      writeToServer.write(buffer, 0, bytesRead) 
     } 

     while ((available = readFromServer.available()) != 0) { 
      if (available > 1024) available = 1024 
      bytesRead = readFromServer.read(buffer, 0, available) 
      writeToClient.write(buffer, 0, bytesRead) 
     }                      
     } catch (e) { 
     print e 
     } 

     println "Connected:  " + this.inbound.isConnected() 
     println "Bound:   " + this.inbound.isBound() 
     println "InputShutdown: " + this.inbound.isInputShutdown() 
     println "OutputShutdown: " + this.inbound.isOutputShutdown() 
     print "\n"; 

     Thread.sleep(10) 

    } 

關閉套接字的測試永遠不會指出套接字已關閉。而且,正如我所提到的,我無法找到任何有關如何在不進行阻止讀取的情況下檢測到流中「END OF FILE」條件的示例。

還有一種方法。這裏有人知道它是什麼嗎?

回答

2

我假設你正在爲你的I/O使用java.net.Socket。爲了在Java中執行非阻塞I/O,您必須使用NIO軟件包。

尤其是,您需要使用java.nio.channels.SocketChannel進行通信。在通道上調用configureBlocking(false),則read()將返回讀取的數據量,關閉時爲-1,如果沒有可用數據,則返回零。在某些錯誤情況下也會引發異常。

這是一個example顯示使用SocketChannel的非阻塞I/O。

0

不,這沒有幫助。你甚至可以知道如果連接在另一端關閉,你應該讀取它,而java nio選擇器在這種情況發生時不會將通道置於就緒狀態?

就我所知,它只是被設計打破了,而且沒有辦法做到這一點。請別人糾正我,如果我錯了...

+1

同意!我現在正面臨着這個問題 - 如果另一方死亡,我不會收到讀取事件,甚至寫入套接字也不會報錯。多麼痛苦...... – trojanfoe 2011-02-08 11:15:39