java - 在控制台应用程序终止的情况下如何正确关闭 java.net ServerSocket?
问题描述
使用 eclipse 多次运行和终止我的 java 程序时,会发生异常:
Exception in thread "main" java.net.ConnectException: Connection refused: connect
我知道这是因为我在上次执行期间打开的套接字没有关闭。
我试过:(1)Runtime.getRuntime().addShutdownHook 关闭 SocketServer 实例
(2) 在 finally 块中关闭 ServerSocket 实例
public static void main(String ... args) throws Exception {
// propagating Exception(s) to main method for brevity
ServerSocket serverSocket = new ServerSocket(55555, 100,
InetAddress.getByName("localhost"));
System.out.println("Server started at: " + serverSocket);
while (true) {
System.out.println("Waiting for a connection...");
final Socket activeSocket = serverSocket.accept();
System.out.println("Received a connection from " + activeSocket);
Runnable runnable = () -> {
try {
BufferedReader socketReader = null;
BufferedWriter socketWriter = null;
socketReader = new BufferedReader(new InputStreamReader(activeSocket.getInputStream()));
socketWriter = new BufferedWriter(new OutputStreamWriter(activeSocket.getOutputStream()));
String incomingMsg = null;
while ((incomingMsg = socketReader.readLine()) != null) {
socketWriter.write("Response for message: "+incomingMsg+"\r\n"); // Just a dummy code for brevity
socketWriter.flush();
}
} catch(Exception ex) {
// I do nothing here for brevity
}
};
new Thread(runnable).start();
}
}
}
谁能帮我理解我应该如何解决这个问题以及在异常终止的情况下如何正确关闭 ServerSocket?
解决方案
推荐阅读
- vue.js - vuejs、socket 和 cloudflare 的问题
- latex - 如何在每章的前面创建一个目录,列出该章的内容?
- java - 深度连接的 HIbernate Criteria Query 性能问题
- pandas - 熊猫:如何对列更改进行分组?
- reactjs - reactjs悬停在样式组件中:下拉菜单
- python - 这个 sha256 散列方法的 PHP 等价物是什么
- r - 努力将数学表达式转换为代码以便我可以表示它
- javascript - Discord.js 静音命令仅发送不正确命令的嵌入
- ios - 在 CalendarKit 中跨天创建事件
- asp.net-core - ASP.NET Core 中间件能否使用 Razor 有条件地呈现 HTML?