我创建了一个简单的方法来尝试确定套接字是否在远程计算机上打开。这是我的代码:
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,我发现它显然没有被使用。我错过了什么吗?
答案 0 :(得分:3)
如果您想联系收听(服务器)套接字,则应使用Socket
而不是ServerSocket
。请参阅ServerSocket javadoc,ServerSocket构造函数的第三个参数是绑定的本地地址,而不是远程地址< strong> connect to。
试试这个:
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) {
}
答案 1 :(得分:0)
你缺少的是忽略你的IOException,它可能告诉你,你不能假装成另一台服务器。我建议你只忽略选择预期的异常
使用套接字作为@fvu建议并返回boolean
而不是Boolean