亲爱的 StackOverflow 用户,您好。我又来这里回答一个关于Java Socket和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:地址已在使用中(绑定(bind)失败)
我找了好久了,还是没找到解决办法。提前致谢。
最佳答案
我没有明确的答案,但我确实有一些可能的问题和一些改进。
- 您没有关闭某些可关闭的资源。
- 该线程中可能会引发异常但未被捕获。
改进
- 4 个可关闭对象全部放入多个 try-with-resources 中。
- 您现在正在使用 ThreadFactory 来打印所有未捕获的异常。
- 您现在正在打印 IOException(如果发生)。
- 您现在使用的是使用 ThreadFactory 的 ExecutorService。
ThreadFactory threadFactory = new ThreadFactoryBuilder()
.setUncaughtExceptionHandler((thread, throwable) -> throwable.printStackTrace())
.setNameFormat("my-server-thread")
.build();
ExecutorService service = Executors.newSingleThreadScheduledExecutor(threadFactory);
service.submit(() -> {
while(true) {
try (ServerSocket serverSocket = new ServerSocket(port)) {
try (Socket socket = serverSocket.accept()) {
try (InputStreamReader streamReader = new InputStreamReader(socket.getInputStream());
BufferedReader br = new BufferedReader(streamReader)) {
String line;
while ((line = br.readLine()) != null) {
// your other code in here
}
}
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
});
关于Java、套接字、线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60013034/