使用Java检查打开的端口

时间:2011-02-03 08:19:22

标签: java sockets tcp

使用Java,如何检查特定的TCP / IP端口是否已打开且未被防火墙阻止?

3 个答案:

答案 0 :(得分:2)

如果通过“port is open”表示您的服务器应用程序可以使用此端口,那么您可以这样做:

try {
    serverSocket = new ServerSocket(port);
} catch (IOException e) {
    System.out.println("Could not listen on port: " + port);
    // ...
}

如果无法在此端口上打开服务器套接字,则抛出IOException。

如果“未被防火墙阻止”是指可以从网络外部的主机访问此端口,那么没有直接的方法可以检查这一点,而无需尝试打开与主机的连接:来自外部网络的端口。在您的服务启动的主机和主机之间可能存在其他防火墙/ NAT,主机可能会尝试连接到您的服务。

有一些常用技术可以检查来自外部网络的服务可访问性,例如,请参阅NAT traversal

答案 1 :(得分:2)

检查入站连接是否已打开端口?你必须问防火墙。假设你听一个端口,但是这个端口被防火墙阻止,那么你就会“永远”等待。

唯一的出路 - 在网络/机器外部运行一个小型服务器,并远程询问它与您机器上给定端口建立连接。如果能够连接,远程服务器可以回复(在不同的频道上)。

另一个想法:使用Web上的众多端口测试服务之一。谷歌搜索“端口测试在线”给出了一些结果。

答案 2 :(得分:2)

Socket允许网络中的2台机器之间的连接。这种方式可能有几个filrewalls:

  1. 双方个人防火墙
  2. 双方公司的防火墙。
  3. 双方互联网服务提供商的防火墙。
  4. 可以将防火墙配置为阻止

    1. 某些IP
    2. 某些端口
    3. 某些协议
    4. 交通方向(进/出界限)
    5. 此外,从TCP的角度看,有两种不同的情况看起来相同:

      1. 服务器未侦听端口
      2. 防火墙阻止连接(见上文)
      3. 首先,您必须决定要测试什么。例如,如果您只想知道可以连接到特定计算机上的特定端口new Socket(host, port)并捕获异常。如果你想区分防火墙困扰你或遥控器没有响应的情况是不够的。

        在这种情况下,您需要一些其他参考。例如,您知道远程主机上有HTTP服务器以及可以被防火墙阻止的其他专有服务器,您可以先建立HTTP连接(检查主机是否处于活动状态),然后尝试连接到套接字。如果HTTP工作,套接字不可能防火墙阻止它。