【问题标题】:TCP\IP client - EHOSTUNREACH (No route to host)TCP\IP 客户端 - EHOSTUNREACH(没有到主机的路由)
【发布时间】:2012-09-13 09:30:27
【问题描述】:

我正在尝试开发客户端服务器 TCP/IP 应用程序。我有一台服务器在我的 PC 上运行,客户端应用程序在移动设备上运行。它们都在同一个 Wi-Fi 网络中,但我无法在它们之间建立连接。在调试客户端 Android 应用时显示以下错误:

09-21 01:08:40.422: W/System.err(8536): java.net.ConnectException: failed to connect to /192.168.15.115 (port 4449): connect failed: EHOSTUNREACH (No route to host)
09-21 01:08:40.453: W/System.err(8536):     at libcore.io.IoBridge.connect(IoBridge.java:114)
09-21 01:08:40.453: W/System.err(8536):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
09-21 01:08:40.453: W/System.err(8536):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
09-21 01:08:40.453: W/System.err(8536):     at java.net.Socket.startupSocket(Socket.java:566)
09-21 01:08:40.453: W/System.err(8536):     at java.net.Socket.tryAllAddresses(Socket.java:127)
09-21 01:08:40.453: W/System.err(8536):     at java.net.Socket.<init>(Socket.java:177)
09-21 01:08:40.453: W/System.err(8536):     at java.net.Socket.<init>(Socket.java:149)
09-21 01:08:40.453: W/System.err(8536):     at sabarish.example.client_mobile.MainActivity$1.onClick(MainActivity.java:61)
09-21 01:08:40.453: W/System.err(8536):     at android.view.View.performClick(View.java:3511)
09-21 01:08:40.453: W/System.err(8536):     at android.view.View$PerformClick.run(View.java:14105)
09-21 01:08:40.453: W/System.err(8536):     at android.os.Handler.handleCallback(Handler.java:605)
09-21 01:08:40.453: W/System.err(8536):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-21 01:08:40.453: W/System.err(8536):     at android.os.Looper.loop(Looper.java:137)
09-21 01:08:40.453: W/System.err(8536):     at android.app.ActivityThread.main(ActivityThread.java:4424)
09-21 01:08:40.453: W/System.err(8536):     at java.lang.reflect.Method.invokeNative(Native Method)
09-21 01:08:40.453: W/System.err(8536):     at java.lang.reflect.Method.invoke(Method.java:511)
09-21 01:08:40.453: W/System.err(8536):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-21 01:08:40.453: W/System.err(8536):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-21 01:08:40.453: W/System.err(8536):     at dalvik.system.NativeStart.main(Native Method)
09-21 01:08:40.457: W/System.err(8536): Caused by: libcore.io.ErrnoException: connect failed: EHOSTUNREACH (No route to host)
09-21 01:08:40.457: W/System.err(8536):     at libcore.io.Posix.connect(Native Method)
09-21 01:08:40.457: W/System.err(8536):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)
09-21 01:08:40.457: W/System.err(8536):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
09-21 01:08:40.457: W/System.err(8536):     at libcore.io.IoBridge.connect(IoBridge.java:112)
09-21 01:08:40.457: W/System.err(8536):     ... 18 more

我正在使用的代码:

public class MainActivity extends Activity {
    private Socket client;
    private PrintWriter printwriter;
    private EditText textField;
    private Button button;
    private String messsage;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textField = (EditText) findViewById(R.id.editText1); //reference to the text field
        button = (Button) findViewById(R.id.button1); //reference to the send button

        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                messsage = textField.getText().toString(); //get the text message on the text field
                textField.setText("");      //Reset the text field to blank

                try {
                    client = new Socket("192.168.15.115", 4449);  //connect to server
                    printwriter = new PrintWriter(client.getOutputStream(),true);
                    printwriter.write(messsage);  //write the message to output stream

                    printwriter.flush();
                    printwriter.close();
                    client.close();   //closing the connection

                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }); 
    }
}

我做错了什么?

【问题讨论】:

  • 在你的电脑端解锁你的防火墙,可能是端口被阻止了或者......确认并检查你的私人IP地址是否在192.168.xy范围内,并且wifi上的dhcp确实是碟形将 192.168.xy 的相同网络地址范围输出到您的 android 设备...

标签: java android tcpclient


【解决方案1】:

这看起来像是网络问题而不是 Java 问题。要么:

  • 客户端的网络要么不知道如何将数据包路由到服务器,
  • 客户端在端口 4449 上的连接尝试被防火墙或数据包过滤器阻止,或者
  • 您使用了错误的 IP 地址。

(“没有到主机的路由”消息表明这是第一个问题,但防火墙有时会配置为对不需要的流量做出误导性的响应。)

无论如何,您最好寻找有关如何配置和/或网络和路由的站点。

【讨论】:

    【解决方案2】:

    no route 错误表示在尝试 TCP 连接时,由于底层协议软件找不到网络节点到网络节点到指定目标节点的路由,连接失败。

    此修复在某种程度上取决于操作系统,但主要需要您设置路由表,以便您尝试连接的设备能够确定如何访问您要连接的设备。

    通常您指定一个网关,当您尝试连接时,连接请求会从网关发出,由路由器等其他信息技术设备解析。

    这看起来是一个 Android 设备,所以首先要确保您有连接,无论是 WiFi 还是手机。另一种方法是确保 WiFi 或手机已打开并正常运行。

    您指定的 IP 地址通常位于私有子网中。所以要检查的是您尝试连接的设备是否与您的设备在同一个子网上。

    这是document on sub-nets and routing

    引用用户 detenson 对 Android 的评论

    用户 detenson 在 2017 年 5 月 13 日发表的评论添加了此特定于 Android 的附加信息以及帖子中提供的错误消息。

    由于这是 android,您需要查看的第一件事是 权限。 09-21 01:08:40.457: W/System.err(8536): 在 libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 表示 连接被设备上的政策拒绝。

    【讨论】:

    • 既然这是android,你首先需要看的是权限。 09-21 01:08:40.457: W/System.err(8536): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 表示连接被设备上的策略拒绝。
    【解决方案3】:

    是的..

    主机无法访问,就这样。但是,如果一切正常(配置良好的节点/网络、良好的 wifi 信号......)您可以使用 ping serverIP(来自电话)或 ping smartphone(来自服务器)强制执行该过程。

    ping(ICMP 数据包)将强制路由器加速新路由(到达主机的方式)...发送大量 ping(-n 选项)例如:ping google.com -n 1000(1000 个连续 ping)

    【讨论】:

    • 在尝试连接(应用程序)的同时执行 ping... 您可以考虑对 serverPort 进行 telnet(以确保其打开)
    • A ping 可能会填充本地 ARP 表,但它不太可能影响其他任何东西,包括路由表(静态或使用 BGP 等协议配置,而不是由设备配置)。而且由于执行 ARP 只需几毫秒即可获取同一本地子网上 IP 地址的 MAC 地址,因此您不会加快任何速度。
    【解决方案4】:

    您好,我在我的 mac 中遇到了同样的问题,并在 android 设备上运行该应用程序。我必须做以下两件事才能让它发挥作用:

    1. 在 mac 中关闭防火墙
    2. 启用红外接收器(系统偏好设置 > 安全 > 防火墙 > 高级)

    它成功了!

    【讨论】:

    • 这对我有用,但我觉得关闭防火墙有点不安
    【解决方案5】:

    当我开发一个android应用程序与java桌面服务器通信时,我遇到了同样的问题,要解决这个问题,只需断开连接android手机和PC的usb电缆。

    【讨论】:

    • 您的回答甚至与所问的问题都不匹配...usb 电缆怎么会成为移动网络的问题。
    • 这不可能是一个解决方案,它不会起作用。
    • 我从早上开始就在尝试这非常奇怪,这解决了我的问题。
    【解决方案6】:

    在您的手机上下载一个 ping 应用程序,如果可以,请尝试 ping 服务器 ip ... 如果使用 apache 将本地机器 IP 放在 httpd.conf 配置文件中。

    # Change this to Listen on specific IP addresses as shown below to 
    # prevent Apache from glomming onto all bound IP addresses.
    #
    #Listen 12.34.56.78:80
    Listen 127.0.0.1:80
    Listen 192.168.1.30:80  (your IP)
    

    【讨论】:

      【解决方案7】:

      关闭移动 WiFi,然后再打开

      WifiManager mWifiManager = (WifiManager) mContext.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
      
      mWifiManager.setWifiEnabled(false);
      mWifiManager.setWifiEnabled(true);
      

      然后再次尝试创建套接字连接

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        • 1970-01-01
        • 2018-10-19
        • 2013-01-12
        • 1970-01-01
        • 2018-09-19
        相关资源
        最近更新 更多