在Android应用中,有时应用会被强制关闭。但是,服务器套接字仍在使用中。所以,下次我启动应用程序时,它会给我错误
java.net.BindException:bind failed:EADDRINUSE(Address已经在 使用)
启动套接字的代码是
ServerSocket serverSocket;
serverSocket = new ServerSocket(); // <-- create an unbound socket first
serverSocket.setReuseAddress(true);
serverSocket.bind(new InetSocketAddress(SERVER_PORT))
我希望确保,当我重新启动时..它应该重新使用套接字。
答案 0 :(得分:3)
我猜你的应用程序因为一个不受控制的异常而被迫关闭。理想情况下,您应该修复任何问题,迫使您的应用关闭,而不是搜索解决方法。
在任何情况下,您都应该始终使用finally
块来关闭资源,这样即使出现异常,它们也会被关闭。
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权限,则无法强制关闭属于另一个进程的现有套接字。