java - 如果套接字已打开,则强制关闭该套接字

标签 java android sockets

在 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/

相关文章:

Java - 只有 TLS 的 SSLServerSocket

sockets - 在 erlang 中编写并行 TCP 服务器

Java ServerSocket OutputStream 不刷新

java - Java中处理null null值不打印

java - Android:创建一个新类?或者我可以使用当前的 Activity 吗?

java - 在 Bluemix 上使用 Liberty for Java 的 Cloud Foundry/Spring Boot 应用程序在启动时突然崩溃,几个月来没有更改代码

android - Android 中动态更新启动器图标

android - Quickblox 不适用于 API 11 - javax.net.ssl.SSLPeerUnverifiedException : No peer certificate

java - 如何改变TextView的文字

java - RESTful 中的 500 内部服务器错误