1

を使用してローカル ネットワーク上のデバイスとの通信を確立Socketし、メソッドを使用して接続を確認しようとしていSocket.isConnected()ます。単純に思えますが、奇妙な動作が発生しています。

現在、引数なしのSocket()コンストラクターを使用して未接続のソケットをインスタンス化し、準備ができたらサーバー (デバイスのポート 80) に接続します。コードのスニペットを次に示します。

deviceSocket = new Socket();
...
SocketAddress deviceSocketAddress = new InetSocketAddress(hostName, portNum);
deviceSocket.connect(deviceSocketAddress);
if (deviceSocket.isConnected()){
     System.out.println("Connected to "+hostName+":"+portNum);
}

前述のようportNumに、デバイスで接続する必要がある は 80 ですが、hostName提供されている に関係なく、常にが返されますtrue。10.0.1.115 の IP アドレス (デバイスのアドレス) を指定すると、10.0.1.114 を指定した場合と同じ結果、または 13.2.5.2 のような偽のアドレスが返されます。

私はすでにいくつかの調査を行っており、ソケットが正常に接続された場合にSocket.isConnected()メソッドが返されることを発見しましtrueたが、それは私の問題ではありません。いずれの場合も、接続されていない新しいソケットから開始していることを確認しました.

私は問題を telnet に持ち込むことにしましたが、そこで非常に奇妙なことに気付きました。コマンドtelnet xxx.xxx.xxx.xxx 80がコマンド プロンプトで発行された場合、(エンドポイントが実際に存在しないと仮定して) 適切なエラー メッセージを表示するのではなく、常に空白のページが開き、しばらくハングしてからコマンド プロンプトに戻ります。

Connecting to 13.2.5.2... Could not open connection to the host, on port 82: Connect failed

(また、ポート81を使用しても同じように動作するという奇妙なことがあります。接続が失敗したのは、82または別のランダムポートを使用した場合のみです)

興味深い問題に出くわしたと思いますが、すぐにわかります...

事前にすべての返信に感謝します!

-M

4

1 に答える 1

0

この動作を再現することはできませんが、推測は次のとおりです。

ファイアウォールはポート80(http)と81(多くの場合http代替として使用されます)を許可します。これらのポートは試行し、タイムアウト後に接続に失敗します。ファイアウォールで開いていない他のポート(82など)はすぐに拒否されます。

于 2012-05-16T20:38:50.950 に答える