2010-07-08 50 views
2

我正在處理客戶端套接字連接。客戶端是一個GPRS硬件設備。我在我的服務器上接收來自這個客戶端的請求,然後打開多個線程。我的問題是,當設備/客戶端關閉套接字,然後我的IO檢測到拋出一個異常,但是當我把請求發送到服務器的時候,從設備上關掉電池,它被阻塞而沒有拋出任何異常。有人建議我使用setSOTimeout()來阻塞線程。java在服務器端的I/O塊線程

我試過Socket.setSOTimeout(int)。但對我而言這並不奏效。我正確地發送我的代碼。

// inside main class--- 

    public class ServerSocketClass{ 
    public ServerSocketClass() { 
    try{ 
     serverSocket = new ServerSocket(port);//creating a serversokcet on a port 
    System.out.println("Server waiting for client on port " + 
    serverSocket.getLocalPort()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    handleExceptions("errorServerSocketOpen.txt", e); 
    System.exit(0); 
} 
try { 
    while (true) { 
     Socket clientSocket = serverSocket.accept();//accepting the client connection and //creating client socket 

     new AcceptConnection(clientSocket);//calling the constructor of other //class to open a new thread 
     System.out.println("constructor called....."); 
    } 
} catch (Exception e) { 
    handleExceptions("errorClientSocketOpen.txt", e); 
    } 
    } 
} 
//inside other class--- 


public class AcceptConnection implements Runnable { 
    public AcceptConnection(Socket socket) { 
    this.clientSocket = socket; 
    if (clientSocket != null) { 
     new Thread(this).start(); 
    } 
    public void run() { 
     // clientSocket.setSoTimeout(60000);// this is what i added.timeout on each client socket opened in threads 
     InputStream inputStream = clientSocket.getInputStream(); 
     DataOutputStream dataOutputStream = new DataOutputStream(clientSocket.getOutputStream()); 
     byte[] mainBuffer = new byte[2048]; 
     int len = -1, totalLength = 0; 
     debugInfo = " GOING TO READ FROM SOCKET.... " + "\n"; 
     while ((len = inputStream.read(mainBuffer)) > -1) { 
      totalLength = len; 
     }//end of while 
    } }//end of other class 

我現在的問題是,當多個線程打開,我從客戶端發送數據超過60秒後關閉主插座和停止接收發生readtimeout錯誤data.and。

請幫助我,告訴我我的目標如何實現。

在此先感謝

**

@stephen

** 確定斯蒂芬知道了什麼烏爾想說......你是對你的聲明 「Well yes ... that's what you told it to do.」可能是我不能讓你理解我的問題,或者即使沒有在java中獲得setSoTimeout()邏輯作爲im新手。 我想再問一次... 這是我爲每個客戶端連接創建一個新的客戶端套接字併爲每個客戶端連接打開一個新線程。

while (true) { 
      Socket clientSocket = serverSocket.accept();//accepting the client connection and //creating client socket 
       new AcceptConnection(clientSocket);//calling the constructor of other class to open a new thread 
      System.out.println("constructor called....."); 
     } 
public void run() { 
      // clientSocket.setSoTimeout(60000);// this is what i added.timeout on each uclient socket opened in threads 
........................................ 
....................................... 
} 

現在我想說,如果即時打開一個新的線程爲一個新的客戶端連接,並分別即時把setSoTimeout()每個客戶端連接對象上,然後,如果被阻塞的I /特定線程A O的同時讀取然後在setSoTimeout(50000)中設置了一個超時之後,比如說50秒,只有線程A應該退出讀取並給出異常,而不是其他線程同時運行說B,C,D。但在我的情況下,超時後所有線程返回後提供異常,實際上任何新的客戶端連接都會導致相同的錯誤,並且服務器應用程序停止接收任何讀取的數據 我只想要線程A應該給出異常並從讀取中出來而不會影響其他客戶端套接字對象(或線程)。

現在我希望我已經告訴了你關於我的困惑和問題的一切。

請幫助我,並非常感謝。

+3

昨天你已經問了同樣的問題,你爲什麼不編輯你原來的問題呢? http://stackoverflow.com/questions/3020248/java-io-is-blocked-while-reading-on-socket-when-i-put-off-the-battery-from-devic – Jesper 2010-07-08 11:11:12

+0

你是說插座一個線程中的超時會導致從不同套接字讀取的無關線程拋出異常?如果是這樣,那麼你怎麼知道?難道所有的線程都會在其套接字讀取中超時? – 2010-07-20 19:05:06

+0

是的,這是我也寫了 「,實際上任何新的客戶端連接都會給出相同的錯誤,並且服務器應用程序停止接收任何讀取數據。」 這是一個問題,任何新的客戶端命中serversocket都會得到相同的錯誤,事實上,服務器會立即停止讀取readtimeout的錯誤,從而導致新連接的任何新數據。 – java2485 2010-07-21 04:31:46

回答

0

現在我的問題是,當多個線程打開,我發送客戶端的數據比60秒後,它關閉主要套接字並停止接收data.and readtimeout錯誤發生。

嗯是的......這就是你說的。

當我想到我在回答你剛纔的問題說,你不能區分這些情況:

  • 客戶端沒有數據要發送一段時間。
  • 網絡被分區一段時間。
  • 客戶端已從網絡中消失。

另一個選項是撥打Socket.setKeepAlive()啓用TCP keepalives。這會導致定期執行特殊的「keepalive」握手,以確保TCP/IP連接仍然存在。不幸的是,它看起來不像可以在Java中設置TCP/IP存活時間間隔。

編輯

NIO也無濟於事。當我說「不可以」在...我的意思是它是物理不可能做到這一點。這裏有一個比喻來幫助你理解。

外 WoopWoop和世界其他地區之間的唯一通信是通過 信。每週一次我的朋友在 Outer WoopWoop(誰一個人住)帖子 給我寫了一封信給我填寫關於 八卦。上週我沒有收到我朋友的一封 信。我怎麼能知道:

  1. 我的朋友已經死了,
  2. 我的朋友沒有上週八卦,
  3. 外WoopWoop郵政工人已經罷工,或
  4. 上述所有的?

正確的答案是,我不能說。

+0

感謝你的迴應斯蒂芬。 我讀過關於NIO ..它可以解決我的情況嗎?使用它的優點和缺點是什麼? 如果是的話你可以共享一個使用nio的示例代碼嗎? 在此先感謝。 – java2485 2010-07-13 06:12:07

+0

有人可以幫我嗎? – java2485 2010-07-20 08:32:20