在 Android 应用程序中,有时应用程序会被强制关闭。但是,服务器套接字仍在使用中。所以,下次我启动应用程序时,它会给我错误
java.net.BindException: bind failed: EADDRINUSE (Address already in use)
我启动套接字的代码是
ServerSocket serverSocket;
serverSocket = new ServerSocket(); // <-- create an unbound socket first
serverSocket.setReuseAddress(true);
serverSocket.bind(new InetSocketAddress(SERVER_PORT))
我希望确保,当我重新启动时..它应该重新使用套接字。
最佳答案
我猜您的应用程序由于不受控制的异常而被迫关闭。理想情况下,您应该解决迫使您的应用关闭的任何问题,而不是寻找解决方法。
无论如何,您应该始终使用 finally
block 来关闭资源,这样即使出现异常,它们也会被关闭。
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(); // <-- create an unbound socket first
serverSocket.bind(new InetSocketAddress(SERVER_PORT));
// Do your server stuff
} finally {
if (serverSocket != null) {
serverSocket.close();
}
}
或者更好的是,如果可能的话,使用 try-with-resources (Java 7+):
ServerSocket serverSocket = null;
try (ServerSocket serverSocket = new ServerSocket();) {
serverSocket.bind(new InetSocketAddress(SERVER_PORT));
// Do your server stuff
}
请注意,如果没有 root 权限,您无法强制关闭属于另一个进程的现有套接字。
关于java - 如果套接字已打开,则强制关闭该套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37055343/