【发布时间】: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