web-dev-qa-db-ja.com

TCP \ IPクライアント-EHOSTUNREACH(ホストへのルートなし)

クライアントサーバーの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();
                }
            }
        }); 
    }
}

私は何を間違えていますか?

15
sash

ルートなしエラーは、TCP接続が試行されたときに、指定されたターゲットノードへのネットワークノード間のルートを見つけることができなかったため、接続が失敗したことを示します。

修正はオペレーティングシステムに多少依存しますが、主にルーティングテーブルをセットアップして、接続元のデバイスが接続先のデバイスに到達する方法を見つけられるようにする必要があります。

通常、接続を試みると、接続要求がネットワークゲートウェイから出て、ルーターなどの他の情報技術デバイスによって解決されるゲートウェイを指定します。

これはAndroidデバイスであるように見えるため、最初のことはWiFiまたはセルに関係なく接続できることを確認することです。 。

指定するIPアドレスは通常、プライベートサブネット内にあります。したがって、確認することは、接続しようとしているデバイスが、デバイスが存在する同じサブネット上にあるかどうかです。

サブネットとルーティングに関するドキュメント です。

Androidユーザーdestensonによるコメントからの引用

2017年5月13日にユーザーdestensonからのコメントは、Androidおよび投稿で提供されるエラーメッセージに固有のこの追加情報を追加します。

これはAndroidであるため、最初に確認する必要があるのは権限です。09-21 01:08:40.457:W/System.err(8536) :at libcore.io.BlockGuardOs.connect(BlockGuardOs.Java:85)は、デバイスのポリシーによって接続が拒否されたことを示します。

16

これは、Javaの問題ではなく、ネットワークの問題のようです。次のいずれかです。

  • クライアントのネットワークはパケットをサーバーにルーティングする方法を知らないか、
  • ポート4449でのクライアントの接続試行がファイアウォールまたはパケットフィルターによってブロックされている、または
  • 間違ったIPアドレスを使用しています。

(「ホストへのルートがありません」というメッセージは、それが最初の問題であることを示唆していますが、ファイアウォールは、望ましくないトラフィックに対して誤解を招く応答を提供するように構成されている場合があります。)

とにかく、構成および/またはネットワークおよびルーティングの方法に関するサイトを探した方が良いでしょう。

6
Stephen C

こんにちは、Macでも同じ問題があり、アプリをAndroidデバイスで実行しています。動作させるには、次の2つのことをしなければなりませんでした。

  1. Macでファイアウォールをオフにする
  2. 赤外線レシーバーを有効にします(システム設定>セキュリティ>ファイアウォール>詳細設定)

そしてうまくいきました!

2
trial999

AndroidアプリケーションがJavaデスクトップサーバーと通信し、問題を解決するには、Android PCの電話。

2

お使いの携帯電話にpingアプリをダウンロードし、問題がなければサーバーipにpingを実行してください... Apacheを使用している場合は、httpd.conf構成ファイルにローカルマシンのIPを入れてください。

# 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)
0
Emerson Jones