18

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

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

4

7 に答える 7

17

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

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

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

これは Android デバイスのように見えるため、最初に、WiFi または携帯電話に接続できることを確認してください。もう 1 つは、WiFi またはセルがオンになっており、動作していることを確認することです。

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

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

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

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

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

于 2012-09-20T23:41:32.603 に答える
6

これは、Java の問題ではなくネットワークの問題のようです。また:

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

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

とにかく、ネットワークやルーティングの設定方法に関するサイトを探したほうがよいでしょう。

于 2012-09-20T23:40:27.213 に答える
2

Javaデスクトップサーバーと通信するAndroidアプリケーションを開発したときに同じ問題に直面しました。この問題を解決するには、Android携帯をPCに接続するUSB​​ケーブルを外すだけです。

于 2016-03-23T22:59:10.930 に答える