连接到服务器时 Java 套接字阻塞

标签 java sockets port blocking

我正在尝试使用 Java 套接字连接到服务器。我正在尝试从端口 80 连接到 90

int port;
Socket clientsocket;
String hostname = "www.google.com";

for(port = 80;port<=90; port++){
  try{
    clientsocket = new Socket(hostname,port);
    System.out.println("Connection at port " + port + "\t" + clientsocket.isConnected());
    clientsocket.close();
  }
  catch(Exception e){
    System.out.println(e.getMessage());
  }
}

当我尝试连接到任何网站(如 google.com 或 w3schools.com)时,我的程序在 socket() 调用端口号(80 除外)时挂起。 由于这些网站不在端口 81-90 上提供服务,因此它应该引发异常,但它却被阻止了。对于端口 80,它工作正常。 当我尝试连接到安装在我机器上的 apache 服务器时,它不会阻止任何端口号并给我连接拒绝错误,这是显而易见的行为。 那么为什么会这样。提前致谢。

最佳答案

When I try to connect to any website like google.com or w3schools.com my program hangs on the socket() call for port numbers except 80. Since those websites are not serving on ports 81-90 it should raise exception but instead it gets blocked.

这几乎肯定不是 Java 做的。

当您调用Socket(String, int) 构造函数时,JVM 会要求操作系统尝试使用提供的端口号与提供的名称对应的 IP 地址建立连接。假设我们正在谈论 TCP/IP,操作系统发送 TCP“SYN”消息,并等待响应:

  • 如果响应是“SYN-ACK”,它会根据协议(protocol)继续建立连接;见http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment .

  • 如果响应是“RST”(重置),则连接失败并导致 Java“连接被拒绝”异常。 (如果“SYN”到达远程服务器,通常会发生这种情况,只是发现您尝试连接的端口上没有“监听”应用程序。)

  • 如果响应是某种类型的 ICMP 消息(例如,ICMP 目标不可到达),这通常会导致连接请求立即失败,并引发 Java 异常。

  • 如果没有响应,操作系统会不断尝试。根据 Java 默认连接超时(或显式超时),此过程可能会持续很长时间。

所以最有可能发生的事情是某些东西正在过滤时髦端口上的“SYN”消息,然后简单地将它们丢弃。它可能是您 PC 上的本地防火墙软件、网关中的防火墙软件或您的 ISP 的网络,或者您尝试与之通信的远程系统中的软件。或者这可能发生在返回的“SYN-ACK”消息上。

无论哪种方式,阻塞/超时行为都是 TCP/IP 网络固有的,并且不可能在操作系统或 Java 级别进行准确诊断。你只需要调整你的期望。 (或者设置更短的连接超时...)

关于连接到服务器时 Java 套接字阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5692102/

相关文章:

java - Spring MVC Controller 请求映射无法正常工作

java - 编译错误: "cannot find symbol"

ios - 无法使用 CocoaAsyncSocket 连接到 IPv6

asp.net-mvc - 使用端口号的 ASP.NET Core 身份验证

localhost - 如何列出在不同端口上运行的所有进程/服务

java - Maven:如何查询可执行类路径?

用于多时区应用程序的 java 日历、日期和时间管理

c++ - Linux、C++、dup(socket) 是否会从另一个非 fork 进程工作(如果不是如何启用它)?

python - 无法通过 Python 中的套接字进行客户端-服务器通信

c - 如何找到任何PC的端口号?