0

シンプルな Java tcp クライアントを作成しました。クライアントを実行するたびに、コマンド ラインでサーバーの IP アドレスを指定します。

指定された IP アドレスでリッスンしているサーバーがない場合、または IP アドレスが存在しない場合、SocketTimeoutException が発生します。これは、クライアントが実行されているサブネット外の IP アドレスに対して正常に機能します。クライアントの同じサブネットで間違ったサーバー IP アドレスを指定すると、代わりに java.net.NoRouteToHostException が発生します。

これは私にとって奇妙です。両方のアドレスが同じサブネットに属しているため、サーバーに到達するために IP ルートを設定する必要はまったくありません。これは、サーバーがクライアントとは異なるサブネット上にあり、クライアントが実行されているホストにデフォルト ゲートウェイがない場合に当てはまります。

私が望むのは、クライアントの同じサブネット上の間違ったアドレス (つまり、リッスン サーバーまたは存在しないアドレスがないアドレス) に対しても、単に SocketTimeoutException を受け取ることです。

どうすればこの動作を取得できますか?

ありがとうございました

4

2 に答える 2

0

実際には、これらの条件の両方を 1 つの例外にラップすることはできません。問題は、ここで 2 つの別々のことが起こっていることです。

ローカル サブネットからパケットを送信するために、アプリを実行しているシステムは、ローカル ゲートウェイを使用してチェーン内の次のルーターにパケットを送信し、宛先ネットワークに到達するまでこれを繰り返します。指定された宛先アドレスには誰もいないため、何も応答せず、タイムアウト例外が発生します。

ローカル サブネットの場合、システムは宛先アドレスに直接接続しようとします。これは、最初にある種の ARP 要求を送信することを意味します。残念ながら、これに対する応答はなく、システムはパケットの送信方法を認識できないため、「これを送信する方法が見つかりません」というエラーが発生します。別名、NoRouteToHost 例外。

違いは、最初のケースではシステムは要求を送信できますが、2 番目のケースでは送信できないことです。そのため、2 つの別個のエラーがあります。

于 2013-01-24T23:24:32.190 に答える
0

この 2 つの例外には違いがあります。

1. NoRouteToHostException:

ソケットをリモート アドレスおよびポートに接続しようとしたときにエラーが発生したことを通知します。通常、介在するファイアウォールが原因で、または中間ルーターがダウンしている場合、リモート ホストに到達できません。

2.SocketTimeoutException

ソケットの読み取りまたは受け入れでタイムアウトが発生したことを通知します。

したがって、 がある場合NoRouteToHostException、これはそのアドレスに到達できない (あなたの場合はおそらく存在しない) ことを意味し、このアドレスがある場合はSocketTimeoutException存在するが、特定のポートに接続できない (何もリッスンしない) ことを意味します。 .

于 2013-01-23T21:53:44.140 に答える