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’,则按照协议继续建立连接;见http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment.
>如果响应是’RST'(重置),则连接失败,这会导致Java“连接被拒绝”异常. (这通常是’SYN’进入远程服务器时发生的情况,只是发现在您尝试连接的端口上没有“侦听”应用程序.)
>如果响应是某种ICMP消息(例如,ICMP目标不可达),则通常会导致连接请求立即失败,并导致Java异常.
>如果没有响应,操作系统将再次尝试,并再次尝试.根据Java默认连接超时(或显式超时),此过程可能会持续很长时间.
所以最有可能发生的事情就是在某个时髦的端口上过滤掉“SYN”消息,并简单地将它们丢弃.它可能是PC上的本地防火墙软件,网关中的防火墙软件,或ISP的网络,或者您尝试与之通信的远程系统中的软件.或者这可能发生在回来的’SYN-ACK’消息中.
无论哪种方式,阻塞/超时行为都是TCP / IP网络所固有的,并且无法在OS或Java级别进行准确诊断.你只需要调整你的期望. (或设置较短的连接超时…)