【发布时间】:2020-02-01 00:42:30
【问题描述】:
亲爱的 StackOverflow 用户您好。我又来这里回答一个关于Java Socket and Thread的问题。 我当前的代码:
new Thread(()->{
System.out.println("Thread.......");
try {
while(true){
ServerSocket serverSocket = new ServerSocket(serverPort);
Socket socket = serverSocket.accept();
final InputStreamReader streamReader = new InputStreamReader(socket.getInputStream());
BufferedReader br = new BufferedReader(streamReader);
String line = null;
while ((line = br.readLine()) != null){
JsonObject result = new Gson().fromJson(line, JsonObject.class);
String token = result.get("serverToken").getAsString();
String player = result.get("player").getAsString();
String value = result.get("quantity").getAsString();
System.out.println(token+"/"+serverToken);
if(token.equals(serverToken)){
String command = activeCommand;
command = activeCommand.replace("%value%", value);
command = activeCommand.replace("%player%", player);
execCommand(command);
System.out.println("Acertou a token!");
}else{
System.out.println("Token incorreta!");
}
}
serverSocket.close();
socket.close();
Boolean isClosed = socket.isClosed();
System.out.print(isClosed);
}
} catch (IOException e) {
System.out.println(e);
}
}).start();
在某种程度上,它运作良好。几次请求后,它只是给出了错误:java.net.BindException: Address already in use (Bind failed)
我一直在寻找一段时间,但我还没有找到解决方案。提前致谢。
【问题讨论】:
-
你没有关闭大量的 Closeable 对象,你肯定需要这样做。可能是抛出异常并被吞掉,导致套接字未关闭。
-
线程关闭后是否会触发任何东西来关闭连接? @杰森
-
不是线程,但您可以使用 Callable
并在结果上确保套接字已关闭。我会在下面得到答案。
标签: java multithreading sockets bukkit