TCP\IP客户端 - EHOSTUNREACH(无主机路由)

sas*_*ash 15 java android tcpclient

我正在尝试开发客户端服务器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
Run Code Online (Sandbox Code Playgroud)

我正在使用的代码:

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();
                }
            }
        }); 
    }
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Ric*_*ers 16

无路由错误表示当尝试TCP连接时,连接失败,因为底层协议软件找不到网络节点到网络节点路由到指定目标节点.

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

通常,您指定一个网关,当您尝试连接时,连接请求将从网络网关发出,以便由其他信息技术设备(如路由器等)解析.

这看起来像是一个Android设备,所以首先要确保你有WiFi或手机连接.另一种方法是确保WiFi或单元打开并运行.

您指定的IP地址通常位于私有子网内.因此,要检查的是您尝试连接的设备是否与您的设备所在的子网相同.

这是一个关于子网和路由文档.

来自用户destenson对Android的评论引用

用户destenson在5月13日至2017年5月发表的评论添加了特定于Android的附加信息以及发布中提供的错误消息.

由于这是android,你首先要看的是权限.09-21 01:08:40.457:W/System.err(8536):at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)表示设备上的策略拒绝连接.


Ste*_*n C 6

这看起来像一个网络问题而不是Java问题.或者:

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

("无主机路由"消息表明这是第一个问题,但防火墙有时会配置为对不需要的流量提供误导性响应.)

无论如何,你最好寻找一个如何配置和/或网络和路由的网站.