查找开放端口TCP通信

时间:2011-09-14 01:08:05

标签: java sockets networking tcp serversocket

我正在编写像AIM这样的Java应用程序,我想要一个查找服务器来帮助两个客户端通过ServerSocket类相互连接。不幸的是,serversocket需要一个开放端口,否则它将被防火墙阻止。没有客户端手动更改其防火墙设置有一种方法,我可以找到一个开放的端口,打开一个端口(如果它要求许可它没关系)我只是不希望每个客户端手动必须更改防火墙设置。谢谢!

2 个答案:

答案 0 :(得分:3)

创建ServerSocket是打开服务器端端口的原因(假设端口在防火墙上也没有被阻止)。在许多系统上,防火墙不会阻止端口号<1024,因此通常不需要自定义配置。但是,由于许多ISP对其网络中阻塞的端口越来越严格,许多软件已经转移到80端口上运行。为什么端口80?它是用于HTTP的端口,因此对于在Web上运行的任何服务,100%的时间都非常开放(在防火墙处)。

要回答如何查找开放端口的问题,端口扫描程序将执行此功能。基本上他们所做的只是尝试在一系列端口(例如端口1-1024)上建立连接。当连接成功时(在Java中你会看到这是一个通过Socket的良好连接),你可以认为该端口是“开放的”。您无需交换任何数据即可建立连接,只需建立连接,然后关闭它即可。

此外,如果服务器上没有运行任何类型的服务器软件,即使没有阻止,它也不会显示为“打开”。如果没有成功的Socket(TCP)连接,您将无法知道哪些端口未被用户的防火墙阻止。

重申一下,我在两个相关但又分开的概念之间来回切换。防火墙可以阻止/打开端口,也可以进行端口转发。这与给定机器上的连接“打开”的端口不同。为了让机器接受给定端口上的连接,必须有一个软件监听该端口上的连接,否则无法建立连接。

答案 1 :(得分:2)

我建议看看几个不那么麻烦的替代解决方案 - 扫描开放端口可能需要相当长的时间,可能会引起感觉受到攻击的防火墙的恐慌反应,等等。有一些技术正在积极使用,并且已经开发出来,以解决防火墙后面的服务器问题。

  1. UDP Hole Punching,需要零用户端配置。有关Skype如何使用此技术的简单说明,请参见here
  2. UPnP / IGD可以作为替代方案,但由于安全问题,现在较少的设备支持开箱即用。
  3. STUN,其客户端和服务器端的Java实现名为JSTUN
  4. 无论您选择哪种解决方案,都要与不同的互联网服务提供商进行彻底的测试,您可以预期会遇到很多限制端口。