2013-02-25 86 views
3

我在我的android應用程序中使用TCP連接。連接運行在專用線程中。Android TCP:錯誤EHOSTUNREACH

我的代碼:

class ReceiverThread extends Thread { 
Handler handler; 

ReceiverThread(Handler h) { 
    handler = h; 
} 

@Override 
public void run() { 


    try { 
      socketTCP = new Socket((SERVERIP), SERVERPORT); 
      in = new BufferedReader(new InputStreamReader(
        socketTCP.getInputStream())); 
      socketTCP.setSoTimeout(20000); 

      while (TCPRunning) { 

       String strTcp = in.readLine().toString(); 
       i++; 
       Message msg = handler.obtainMessage(); 
       Bundle b = new Bundle(); 
       b.putString("getStr", strTcp + "\n"); 
       msg.setData(b); 
       handler.sendMessage(msg); 

      } 

     } catch (UnknownHostException e) { 
      Log.v("TcpClient", "Unknown host"); 
      try { 
       socketTCP.close(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 
      e.printStackTrace(); 

     } catch (SocketException e) { 
      // Erreur TimeOut 
      Message msg = handler.obtainMessage(); 
      Bundle b = new Bundle(); 
      b.putString("getStr", "Error"); 
      msg.setData(b); 
      handler.sendMessage(msg); 
      e.printStackTrace(); 

     } catch (IOException e) { 
      if (socketTCP != null) { 
       try { 
        socketTCP.close(); 
        socketTCP = null; 
       } catch (IOException e1) { 
        e1.printStackTrace(); 
       } 
      } 

     } finally { 
      try { 
       i = 0; 
       if (in != null) { 
        in.close(); 
       } 
       if (socketTCP != null) { 
        socketTCP.close(); 
        socketTCP = null; 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

然後我的Android設備連接到其他設備的無線網絡連接,當我啓動我的應用程序;它運作良好:我收到其他設備發送的數據。 當我停止連接並重新啓動時(幾秒鐘後)它可以工作。

但是,當我等待2至3分鐘,然後連接變得不可能:

我得到以下異常:

02-25 10:40:32.638: W/System.err(4384): java.net.ConnectException: failed to connect to /192.168.56.1 (port 50000): connect failed: EHOSTUNREACH (No route to host) 
02-25 10:40:32.648: W/System.err(4384):  at libcore.io.IoBridge.connect(IoBridge.java:114) 
02-25 10:40:32.648: W/System.err(4384):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
02-25 10:40:32.648: W/System.err(4384):  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
02-25 10:40:32.648: W/System.err(4384):  at java.net.Socket.startupSocket(Socket.java:566) 
02-25 10:40:32.648: W/System.err(4384):  at java.net.Socket.tryAllAddresses(Socket.java:127) 
02-25 10:40:32.658: W/System.err(4384):  at java.net.Socket.<init>(Socket.java:177) 
02-25 10:40:32.658: W/System.err(4384):  at java.net.Socket.<init>(Socket.java:149) 
02-25 10:40:32.658: W/System.err(4384):  at nke.service.wificonnection.ThreadWifi$ReceiverThread.run(ThreadWifi.java:163) 
02-25 10:40:32.658: W/System.err(4384): Caused by: libcore.io.ErrnoException: connect failed: EHOSTUNREACH (No route to host) 
02-25 10:40:32.658: W/System.err(4384):  at libcore.io.Posix.connect(Native Method) 
02-25 10:40:32.658: W/System.err(4384):  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 
02-25 10:40:32.668: W/System.err(4384):  at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
02-25 10:40:32.668: W/System.err(4384):  at libcore.io.IoBridge.connect(IoBridge.java:112) 
02-25 10:40:32.668: W/System.err(4384):  ... 7 more 

如果我想再次使用的連接,我必須刷新wifi連接(在Android的參數中,停止並重新啓動wifi並連接到設備的wifi)。

可能是什麼問題?錯誤後關閉套接字時是否有問題?

回答

1

EHOSTUNREACH錯誤表示目標未響應。

主要有幾個方面,這可能發生:

  • 數據鏈路層已經消失(即無線網絡已經下降)
  • 路由表發生了變化,幷包以期望的目的地不再到達
  • 防火牆正在導致數據包被丟棄。
  • 遠程主機不響應的連接請求(端口可能關閉,但過濾)

您可以嘗試連接到目的地其他端口。如果這種方式在您的應用程序沒有運行時起作用,那麼接收(服務器)應用程序不再監聽。如果所有可訪問的端口都突然不可用,那麼這是您的WiFi或路由表或一般防火牆問題。

你仍然可以有一個合法的IP路由到一個主機,但如果它是過濾出於安全原因連接請求,你會得到這個錯誤。對於封閉端口,過濾是很常見的,因此設備的端口掃描不會透露任何東西,只是空洞,就好像該地址上沒有任何東西。我找不到任何明確的參考,Android可以做到這一點,但似乎很可能。

+0

如果我從手機上用瀏覽器調用相同的請求我正在得到正確的響應.. – 2017-03-18 14:57:10