我正在處理客戶端套接字連接。客戶端是一個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應該給出異常並從讀取中出來而不會影響其他客戶端套接字對象(或線程)。
現在我希望我已經告訴了你關於我的困惑和問題的一切。
請幫助我,並非常感謝。
昨天你已經問了同樣的問題,你爲什麼不編輯你原來的問題呢? 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
你是說插座一個線程中的超時會導致從不同套接字讀取的無關線程拋出異常?如果是這樣,那麼你怎麼知道?難道所有的線程都會在其套接字讀取中超時? – 2010-07-20 19:05:06
是的,這是我也寫了 「,實際上任何新的客戶端連接都會給出相同的錯誤,並且服務器應用程序停止接收任何讀取數據。」 這是一個問題,任何新的客戶端命中serversocket都會得到相同的錯誤,事實上,服務器會立即停止讀取readtimeout的錯誤,從而導致新連接的任何新數據。 – java2485 2010-07-21 04:31:46