[解決済み】TCP-IPクライアント - EHOSTUNREACH (No route to host)
質問
私は、クライアント・サーバ・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();
}
}
});
}
}
何が間違っているのでしょうか?
どうすればいいですか?
no routeエラーは、TCP接続を試みたときに、基礎となるプロトコルソフトウェアが指定されたターゲットノードへのネットワークノード間のルートを見つけることができなかったため、接続に失敗したことを示しています。
この修正は、OSに多少依存しますが、主に、接続元のデバイスが接続先のデバイスへの到達方法を把握できるように、ルーティングテーブルを設定することが必要です。
通常、ゲートウェイを指定し、接続しようとすると、接続要求がネットワークゲートウェイを経由して、ルーターなどの他の情報技術装置で解決されるようになっています。
これはAndroid端末のようなので、まずWiFiでも携帯でも接続できることを確認することです。 もう一つは、WiFiまたは携帯電話の電源がオンになっており、動作可能であることを確認することです。
指定されたIPアドレスは、通常、プライベートサブネット内にあります。 そこで確認すべきは、接続しようとしているデバイスが、あなたのデバイスと同じサブネット上にあるかどうかです。
以下は サブネットとルーティングに関する文書 .
ユーザ destenson の Android に対するコメントから引用します。
2017年5月13日のユーザーdestensonさんのコメントで、Androidに特化した追加情報と投稿で提供されたエラーメッセージが追加されています。
<ブロッククオートこれはアンドロイドなので、まず最初に見る必要があるのは のパーミッションが必要です。 09-21 01:08:40.457: W/System.err(8536): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85)です。 って 接続がデバイスのポリシーによって拒否されました。
関連
-
[解決済み】Javaの".class期待値"
-
[解決済み】指定された子にはすでに親がいます。先に子の親に対してremoveView()を呼び出す必要がある(Android)
-
[解決済み】Javaクラスの "型に解決できない"
-
[解決済み] hibernate のプロパティが見つかりません。
-
[解決済み] メソッドがそのスーパークラスのメソッドをオーバーライドしない
-
[解決済み】デフォルトのキーストアファイルが存在しない?
-
[解決済み】Javaメソッドスタブ
-
[解決済み】Javaのswitch文。定数式が必要だが、定数である
-
[解決済み] Hide Utility Class Constructor : ユーティリティクラスはパブリックまたはデフォルトコンストラクタを持つべきではありません。
-
[解決済み】javaで無効な文字定数
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】HTTPステータス 405 - リクエストメソッド「POST」はサポートされていません (Spring MVC)
-
[解決済み] hibernateでResultSetを抽出できない。
-
[解決済み] hibernate のプロパティが見つかりません。
-
[解決済み] メソッドがスーパータイプのメソッドをオーバーライドまたは実装していない - Overrideの場合
-
[解決済み】Javaで無限大を実装する方法とは?
-
[解決済み】Javaを使用するSelenium - ドライバの実行ファイルのパスは、webdriver.gecko.driverシステムプロパティで設定する必要があります。
-
[解決済み] [Solved] java.lang.NoClassDefFoundError: クラスXXXを初期化できませんでした。
-
[解決済み】Eclipseで「パッケージエクスプローラー」ビューが見つからない
-
[解決済み] SQLエラー。0, SQLState: 08S01 通信リンクの失敗 [重複]。
-
[解決済み】CreateProcess error=2, The system cannot find file specified.