2013-08-03 46 views
0

我嘗試通過在android上使用套接字與我的服務器連接。我希望它能像這樣工作;當我向服務器發送請求時,如果有響應,請調用我的響應函數。如果發生500毫秒的超時(將檢查異常和我設置的布爾值),我想執行另一個函數。但是使用這個代碼時,當我向服務器發送某些東西並等待響應時,如果有響應,它執行onServerResponse函數,並且在沒有響應時不執行任何操作(掛起)。如何編輯此代碼,以便在沒有響應時它會引發超時異常?Java讀取超時不起作用

  boolean control = false; 
      try{ 
       Socket socket = new Socket(); 
       socket.setSoTimeout(500); 
       socket.connect(new InetSocketAddress(InetAddress.getByName(SERVER_IP),SERVER_PORT)); 
       BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8")); 
       bw.write("asdasd\n"); 
       bw.flush(); 
       control = true; 
       int readInt = -1; 
       String read = null; 
       StringBuilder sb = new StringBuilder(""); 
       while((readInt = socket.getInputStream().read()) != -1){ 
        sb.append((char)readInt); 
       } 
       read = sb.toString(); 
       if(read != null && read.trim().length() > 0){ onServerResponse(read); } 
      }catch(Exception e){ Log.v("Main", "GOT AN ERROR: "+e+control); } 

問題解決了,請參閱評論回答。

+0

沒有什麼錯,你已經發布的代碼,如果調用'閱讀()'塊500ms以上會拋出異常。這可能是連接嘗試是阻塞的。 –

+0

嘿布賴恩,當我設置我的服務器發送響應,我通過onServerResponse接收響應,否則它只是掛在while((readInt = socket.getInputStream()。read())!= -1){並沒有拋出任何例外。 –

+0

那麼我發現是什麼導致了我設置斷點後的問題。顯然系統不會掛起,它不會拋出任何異常或其他東西。想想我需要修改我的代碼才能使用它。不管怎麼說,多謝拉。 –

回答

0

像這樣的工作:

Socket socket = new Socket(); 
InetAddress addr = InetAddress.getByName(SERVER_IP); 
SocketAddress sockaddr = new InetSocketAddress(addr, SERVER_PORT); 
// 500ms is too short, up to you. 
// normal time would be 5 to 20 seconds, depends on network (intranet/internet) 
socket.connect(sockaddr, 500); 
// 500ms to timeout reading from the socket 
socket.setSoTimeout(500); 
2

我不確定這是否回答您的問題,但setSoTimeout僅適用於連接後的套接字讀取,而不適用於建立連接本身。爲此,請使用socket.connect(SocketAddress address, int timout)過載。)過載。你可能想使用兩者。

+0

感謝您的支持,這是我的代碼的缺陷之一,但沒有解決我的問題。我甚至在連接方法的讀取行超出讀取超時之前移動了setSoTimeout。但它沒有解決我的問題。我仍然沒有得到任何東西,如果服務器沒有發送任何響應,系統會一直處於掛起狀態。 –