【问题标题】:Java - Socket has 'connection timed out error' or 'no route to host' error with certain internetJava - 套接字在某些互联网上出现“连接超时错误”或“没有路由到主机”错误
【发布时间】:2011-08-15 23:20:53
【问题描述】:

我正在制作一个带有套接字的客户端/服务器对来来回发送和接收数据。当我在家中使用两台单独的机器作为客户端/服务器时,它可以正常工作。数据被传输等等。

但是,今天当我在当地的一家咖啡店工作时(第二杯,如果相关的话),这不起作用。我不断收到以下错误:连接超时,或者没有到主机的路由。

下面是相关代码:

服务器:

public class TestServer {

public static void main(String[] args) throws Exception {

    TestServer myServer = new TestServer(); 
    myServer.run(); 

}

private void run() throws Exception {

    ServerSocket mySS = new ServerSocket(9999);     

    while(true) {

        Socket SS_accept = mySS.accept(); 

        BufferedReader myBR = new BufferedReader(new InputStreamReader(SS_accept.getInputStream()));

        String temp = myBR.readLine(); 
        System.out.println(temp); 

        if (temp!=null) {

            PrintStream serverPS = new PrintStream(SS_accept.getOutputStream()); 
            serverPS.println("Response received"); 

        }

    }
}

}

客户:(相关部分)

//sends a command to the server, and returns the server's response
private String tellServer(String text) throws Exception {

    mySocket = new Socket("192.168.0.XXX", 9999); //the IPv4 address      

    //use the socket's outputStream to tell stuff to the server 
    PrintStream myPS = new PrintStream(mySocket.getOutputStream()); 
    myPS.println(text); 

    //the following code will get data back from the server
    BufferedReader clientBR = new BufferedReader(new InputStreamReader(mySocket.getInputStream())); 
    String temp = clientBR.readLine(); 

    if (temp!=null) {
        return temp; 
    } else {
        return ""; 
    }

}

这非常简单。再次,如前所述,在我的互联网上它工作正常 - 只需执行 ipconfig,获取 IPv4 地址,然后将其放入客户端。在有免费无线网络的咖啡店里,它不起作用。为了以防万一,我什至摆弄了许多不同的端口。

感谢您的帮助,我是套接字新手,发现这令人困惑。

【问题讨论】:

    标签: java sockets networking


    【解决方案1】:

    192.168.x.y 是本地地址。 source

    您需要 INTERNET 看到的家庭计算机 IP 地址。

    当你下次回家时,去http://www.whatismyip.com/看看它认为你是什么。

    请注意,您可能需要进入路由器并将流量从路由器路由到计算机的 9999 端口,因为这可能是您遇到的问题。

    【讨论】:

    • IP 地址 192.168.x.y 是一个拦截器,但 OP 也可能会发现咖啡店的网络阻止了端口 9999,或者他的笔记本电脑的防火墙阻止了“不安全”网络上的 9999。
    • 您好,感谢您的回复。我尝试用 whatsmyip.com 地址替换本地地址,但没有成功!这是什么意思?
    • 这意味着您的家用计算机和咖啡店的笔记本电脑之间的某些东西已经停止了您的连接。这不是您的家用计算机,因为您过去可以连接到它。如果您的笔记本电脑用于在家中成功的测试,则可能也不是这样,尽管这是可能的。这可能是您可以控制的路由器防火墙,也可能是您无法控制的商店防火墙(如 Stephan 所述)。
    • 好的。我猜大多数提供免费 WiFi 的地方都有非常严密的防火墙……我也在公共图书馆试过这个,它给出了类似的错误。如果我在某处设置路由器,我应该注意什么类型的设置以确保这种类型的套接字连接正常工作?
    • 查找“端口转发”并告诉路由器将端口 9999 上的流量发送到 192.168.0.XXX(服务器机器) - 理想情况下,告诉它将数据发送到 yourServerHostname 以便它动态更改随着您的 IP 变化。
    【解决方案2】:

    当您在同一台机器上同时运行服务器和客户端时,您可以在咖啡店使用环回地址 127.0.0.1。

    使用环回地址并在一台机器上运行服务器和客户端应该一直工作,无论是在家还是在外面。

    您可以按照 Total 的建议检查您的 IP 地址,但只有在您拥有静态 IP 时才会保持不变。如果您不确定您拥有的是静态 IP 地址还是动态 IP 地址,您可能拥有一个动态 IP 地址,但您应该在一周左右的时间内检查您的 IP 地址几次以观察任何变化。

    另一种选择是考虑免费的 dns 服务器,例如http://freedns.afraid.org/ ,设置一个工作以使用该服务定期更新您的 IP 地址,并使用您选择的任何域名来访问您的本地服务器。

    无论使用哪种远程访问家庭网络的方法,您都需要将 9999 上的流量转发到家庭网络上的相关机器。

    HTH :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 2012-04-07
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 2013-04-24
      相关资源
      最近更新 更多