我正在编写一个像 AIM 这样的 Java 应用程序,我想要一个查找服务器来帮助两个客户端使用 ServerSocket 类相互连接。不幸的是,服务器套接字需要一个开放端口,否则它将被您的防火墙阻止。在没有客户端手动更改其防火墙设置的情况下,有没有一种方法可以找到一个开放端口,打开一个端口(如果需要许可就可以),我只是不希望每个客户端都必须手动更改防火墙设置。谢谢!
最佳答案
创建 ServerSocket 可以打开服务器端的端口(假设该端口也没有被防火墙阻止)。在许多系统上,<1024 的端口号不会被防火墙阻止,因此通常不需要自定义配置。然而,由于许多 ISP 对阻止网络内的端口越来越严格,因此许多软件已转为通过端口 80 运行。为什么选择端口 80?它是用于 HTTP 的端口,因此对于在网络上运行的任何服务来说,几乎 100% 的时间都处于开放状态(在防火墙处)。
为了回答如何找到开放端口的问题,端口扫描器执行此功能。基本上,他们所做的就是尝试在一系列端口(例如端口 1-1024)上建立连接。当连接成功时(在 Java 中,您会认为这是通过 Socket 建立的良好连接),您可以认为该端口“打开”。您不需要交换任何数据来建立连接,只需建立连接,然后关闭它。
此外,如果服务器上没有运行任何类型的服务器软件,即使没有被阻止,它也不会显示为“打开”。如果没有成功的套接字(TCP)连接,您将不知道哪些端口没有被用户的防火墙阻止。
重申一下,我在两个相关但独立的概念之间来回切换。防火墙可以阻止/打开端口,或进行端口转发。这与给定计算机上的连接“开放”的端口不同。为了让机器接受给定端口上的连接,必须有一个软件监听该端口上的连接,否则无法建立连接。
关于java - 查找开放端口 TCP 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7410214/