Java网络问题

时间:2011-02-26 11:46:38

标签: java networking

我们有一台路由器和3台PC连接。

  1. PC1:192.168.1.2(无线)
  2. PC2:192.168.1.3(无线)
  3. PC3:192.168.1.6
  4. 默认网关:192.168.1.1

    当PC3尝试使用this forum post中的代码查找连接的PC时,它只返回默认网关的IP地址(该地址是唯一可到达的地址)。

    我尝试增加isReachable()方法的超时。但它仍然只返回默认网关地址。

    我尝试对各个IP地址执行此操作。

    try {
                InetAddress temp2 = InetAddress.getByAddress(new byte[]{(byte) 192, (byte) 168, (byte) 1, (byte) 2});
                if (temp2.isReachable(1100)) {
                    java.lang.System.out.println("IP Address: " + temp2.getHostAddress() + " has connection.");
                }else{
                    java.lang.System.out.println("IP Address: " + temp2.getHostAddress() + " has no connection.");
                }
            } catch (Exception ex) {
                java.lang.System.out.println("Error: " + ex.getMessage());
            }  
    

    然而,在那些PC1和PC2 IP地址上,我只是没有连接状态。 (这意味着无法访问这些IP。)

    但是当我在我的Windows控制台上ping它们时,这些IP已连接并且ping成功。

    1. 我的设置有什么问题。
    2. 我该如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

我相信guido在评论中的理论是正确的。见this question。我意识到链接的答案适用于Linux / UNIX主机,但我刚刚在Windows 7计算机上测试了您的代码,并验证它还将TCP数据包发送到echo端口(7)而不是ICMP回送请求。 (我在{7}} 1.6.0_21报告{7}}的Windows 7框上以Java版ver进行了测试。

典型的Windows计算机可能启用了Windodws防火墙。因此,可能会发生以下事件序列:

  1. 您的Java程序(无法发送和接收ICMP数据包以测试远程Windows主机的可访问性)将尝试通过向端口发送SYN(同步)数据包来启动与远程Windows主机的TCP连接7
  2. 如果没有服务正在该端口上侦听,则远程Windows主机将丢弃该数据包,而不是根据RFC 793的要求使用RST数据包进行响应。也就是说,根据RFC,远程Windows主机应该具有,或者使用TCP进行响应:
    • RST:如果端口没有侦听连接
    • SYN + ACK:如果端口已打开并正在侦听连接
  3. 由于您的Java程序期望在步骤(2)中发生这两件事之一,但完全没有响应(因为Windows在它进入TCP堆栈之前丢弃了SYN数据包),它错误地假定远程Windows主持人失败了。
  4. 很难说“您的设置存在问题”是什么。也许没什么。这取决于您尝试使用此功能的内容。你可能会以错误的方式解决这个问题。您应该意识到Microsoft Windows [Version 6.1.7600]并不总是100%准确地测试主机是否在线。在您的情况下,如果您只对本地网络上的主机感兴趣,则在尝试ping主机后检查ARP表可能更准确。

    可能的解决方法:

    • 尝试在其他计算机上暂时关闭Windows防火墙,看看您的代码是否有效。
    • 编写一些执行单独进程的代码,例如运行ping命令行实用程序来测试可访问性。