java - Java、套接字、线程
问题描述
您好亲爱的 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 资源。
- 可能会抛出异常,但不会在此线程中捕获。
改进
- 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();
}
}
});
推荐阅读
- ajax - 即使使用 SameSite=none,Cookie 也不会附加到请求
- amazon-web-services - 为什么 AWS Step Functions 转义了我的任务的 JSON 输出?
- python - 将 Series 值设置为 0 的最安全和最快的方法
- angular - 使用组件变量值更新快照
- diskspace - 多通道日志 (multipassd.log) 膨胀磁盘
- reactjs - 如何在 React 中使用 Font Awesome Icon?
- visual-studio - “无法连接到‘IIS Express’。” 我该如何解决?
- c# - 如何在程序仍在运行时按顺序运行 C# 代码并在视图中显示一些数据
- android - 我如何使用 2 个扩展 Work() 类的类
- ios - 获取 Storekit 产品时未出现 Apple 登录对话框