0

リモート マシンでソケットが開いているかどうかを判断するための簡単な方法を作成しました。これが私のコードです:

public static Boolean isPortAvailable( int port, String bindAddr  ) {
    try { 
        System.out.println("IP: " + InetAddress.getByName(bindAddr ));
        ServerSocket srv = new ServerSocket(port, 0, InetAddress.getByName(bindAddr ) );  

        srv.close();  
        srv = null;  
        return true;  

    } catch (IOException e) {  
        return false;  
    }
}  

次の 2 つの引数を渡します。

String bindAddr  = "remotemachinename";
int port = 1719;

ポートが使用できないというメッセージが引き続き表示されますが、マシンで netstat -a を実行すると、明らかに使用されていないことがわかります。何か不足していますか?

4

2 に答える 2

3

リスニング (サーバー) ソケットに接続する場合は、Socketではなくを使用する必要がありますServerSocketServerSocket javadocを参照してください。ServerSocket コンストラクターの 3 番目のパラメーターは、接続先のリモートアドレスではなく、バインド先のローカルアドレスです。

これを試して:

try {
    InetAddress addr = InetAddress.getByName(bindAddr);
    Socket sock = new Socket();
    SocketAddress sockaddr = new InetSocketAddress(addr, port);
    int timeout = 1000;   // wait for 1 second = 1000ms (adapt to your use case)
    sock.connect(sockaddr, timeout);
} catch (UnknownHostException e) {
} catch (SocketTimeoutException e) {
    // nobody's listening or willing to accept our connection...
} catch (IOException e) {
}
于 2011-10-03T17:35:18.833 に答える
0

あなたが見逃しているのは、おそらくあなたに言っている IOException を無視することです。別のサーバーのふりをすることはできません。選択された予想される例外のみを無視することをお勧めします

@fvuが示唆するようにSocketを使用し、booleannotを返しますBoolean

于 2011-10-03T17:38:13.343 に答える