Android TCP:错误EHOSTUNREACH

时间:2013-02-25 10:06:07

标签: java android tcp wifi

我在我的Android应用中使用TCP连接。连接在专用线程中运行。

我的代码:

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设备连接到其他设备的wifi,当我启动我的应用程序时;它运作良好:我收到其他设备发送的数据。 当我停止连接并再次启动(几秒钟后)它就可以工作。

但是当我等待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 个答案:

答案 0 :(得分:1)

EHOSTUNREACH错误表示目的地没有响应。

基本上有几种方法可以实现:

  • 数据链路层消失了(即WiFi已经掉线)
  • 路由表已更改,数据包不再到达所需目的地
  • 防火墙导致数据包被丢弃。
  • 远程主机未响应连接请求(端口可能已关闭但已过滤)

您可以尝试连接到目标上的其他端口。如果您的应用没有,那么接收(服务器)应用程序不再监听。如果所有可访问的端口突然没有,那么它就是您的WiFi或路由表或一般防火墙问题。

您仍然可以拥有到该主机的有效IP路由,但出于安全原因它是过滤连接请求,您将收到此错误。对于关闭的端口,过滤是常见的,因此设备的端口扫描不会显示除空洞之外的任何内容,就好像该地址没有任何内容一样。我找不到Android做到这一点的任何明确的参考,但似乎很可能。