2

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

4

2 回答 2

3

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

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

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

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

于 2011-09-14T01:16:58.303 回答
2

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

  1. UDP打孔,需要零用户侧配置。可以在此处找到有关 Skype 如何使用此技术的简单说明
  2. UPnP / IGD可以用作替代方案,尽管由于安全问题,现在很少有设备支持它。
  3. 带有客户端和服务器端的 Java 实现的STUN ,称为JSTUN

无论您选择哪种解决方案,都要通过不同的互联网服务提供商对其进行彻底测试,您可能会遇到很多限制,因为端口会被阻塞。

于 2011-09-14T01:29:04.187 回答