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;  
    }
}  

将这两个参数传递给它:

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

它继续告诉我端口不可用,但如果我在机器上尝试 netstat -a ,我发现它显然没有被使用。我错过了什么吗?

4

2 回答 2

3

如果要联系侦听(服务器)套接字,则应使用 aSocket而不是ServerSocket. 请参阅ServerSocket javadoc,ServerSocket 构造函数的第三个参数是要绑定的本地地址,而不是要连接的远程地址。

试试这个:

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 并返回 a booleannot aBoolean

于 2011-10-03T17:38:13.343 回答