【问题标题】:Java Server Socket connection over different routers不同路由器上的 Java Server Socket 连接
【发布时间】:2020-11-29 08:56:26
【问题描述】:

我目前正在为一个小游戏开发客户端和服务器。 连接到服务器的客户端使用此方法建立连接:

// This method is called, passing on an ipv6 address and port number 6666
        public void startConnection(String ip, int port) throws IOException {
            try {
                clientSocket = new Socket(ip, port);
                out = new PrintWriter(clientSocket.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                //some other code handling responses
            } catch (IOException e) {
                LOG.debug("Error when initializing connection", e);
                throw new IOException();
            }

        }

我建立的服务器接受使用这种方法的连接:

 public void start(int port) {
        try {
            serverSocket = new ServerSocket(port); //port = 6666
//This part is used to handle multiple connections at once
        while (b){
            try {
                map.add(new EchoClientHandler(serverSocket.accept())); //EchoClientHandler is a class used to send and receive data instructions 
                x = map.size() - 1;
                System.out.println("Establishing connection from port " + port);
                map.get(x).start();
                System.out.println("Connection established");
            } catch (SocketTimeoutException e) {
                
            }
        }
        }catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }

这两种方法都可以正常工作,并在客户端和服务器之间建立稳定的连接,但是当我尝试从不同的路由器或一般互联网连接(如通过蜂窝数据)建立连接时,它不起作用。 有没有办法在客户端和服务器都不必从同一个路由器连接的情况下建立连接?

编辑: 这是我从客户端得到的错误,服务器没有显示任何内容:

18:03:24.288 [AWT-EventQueue-0] DEBUG dorusblanken.werwolfclient.Client - Error when initializing connection

java.net.SocketException: Network is unreachable: connect

【问题讨论】:

  • 你能提供更多关于“它不起作用”的细节吗?如果您遇到错误,请将其复制并粘贴到问题中
  • 这是我得到@Joni 的唯一错误
  • 这里有几个不好的做法。 1. 服务器不“建立”连接,它接受它们。 2.你没有设置超时,所以你抓到的SocketTimeoutException不可能被抛出。 3. 您的map 变量显然根本不是Map,而是某种List。 4. 您将对象放入列表然后将其取回而不是首先将其保存在变量中的方法很差。 5. Catch-and-log-and-throw 是不好的做法。只需让异常被抛出,并由调用者记录。如果您可以在此处记录,则可以在此处记录。
  • @Marquis of Lorne 1. 比较新,所以请原谅我的错误术语 2. 代码是缩写的,我删除了超时部分,稍后我将编辑 try catch 块。 3.你说得对,我最近把它从地图改成了列表,但懒得改名字 4.那是因为我一次处理多个客户端,我先存储客户端然后启动它,因为它看起来更多方便(如果你有更好的解决方案,我愿意) 5. 那里也有道理。

标签: java sockets server connection client


【解决方案1】:

“网络不可达”表示无法从当前网络到达目标网络。

您提到您正在尝试通过 Internet 建立连接。为此,目标主机(您的服务器)必须连接到 Internet,它必须具有公共 IP 地址,并且客户端在连接时需要使用公共 IP 地址。

这是最简单的配置。大多数公司实际上并没有将他们的服务器直接放在 Internet 上。相反,公共 IP 通常属于 CDN 或 DDoS 缓解层,它将连接转发到负载均衡器,负载均衡器将连接转发到服务器。

【讨论】:

  • 感谢您的提示。经过长时间的痛苦,我在路由器上设置了端口转发,现在它可以正常工作了。
猜你喜欢
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
相关资源
最近更新 更多