gpt4 book ai didi

java - 安卓 TCP : error EHOSTUNREACH

转载 作者:可可西里 更新时间:2023-11-01 02:34:33 24 4
gpt4 key购买 nike

我在我的 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)。

可能是什么问题?错误后关闭套接字是否有问题?

最佳答案

EHOSTUNREACH 错误意味着目的地没有响应。

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

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

您可以尝试连接到目标上的其他端口。如果这在您的应用程序不起作用时有效,则接收(服务器)应用程序不再监听。如果所有可访问的端口突然都无法访问,则可能是您的 WiFi 或路由表或一般防火墙问题。

您仍然可以拥有到该主机的有效 IP 路由,但如果它出于安全原因过滤 连接请求,您将收到此错误。过滤对于关闭的端口很常见,因此设备的端口扫描除了一个空洞之外不会显示任何东西,就好像该地址没有任何东西一样。我找不到任何明确的引用资料表明 Android 会这样做,但看起来很有可能。

关于java - 安卓 TCP : error EHOSTUNREACH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15064448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com