调用ServerSocket.close()是否足以关闭端口?

时间:2011-07-21 00:02:53

标签: java sockets serversocket

我有一些类似于此的java代码:

private void startServer() throws IOException {
        URLClassLoader classloader = null;

        System.out.println("Opening server socket for listening on " + PORT_NUMBER);
        try {
            server = new ServerSocket(PORT_NUMBER);
            server.setSoTimeout(10000);
            connected = true;
            System.out.println("Server is now listening on port " + PORT_NUMBER);
        } catch (IOException e) {
            System.err.println("Could not start server on port " + PORT_NUMBER);
            e.printStackTrace();
            connected = false;
        }

        while (connected) {

            // Incoming request handler socket.
            Socket socket = null;
            try {
                System.out.println("Waiting for client connection...");
                // Block waiting for an incoming connection.
                socket = server.accept();
                if (socket == null) continue;

...依此类推。当我稍后调用server.close()时(如果我先调用socket.close(),我没有得到任何不同的行为),我没有得到任何错误,但是netstat显示端口仍在被监听。应该调用ServerSocket.close()是否足以释放该系统上的端口?

我正在为Java 1.4.2微操作运行时编程。还值得注意的是,我有这个方法在另一个线程中运行,我试图从其父线程关闭套接字。

EDIT 这是来自netstat的一行,虽然我可以向你保证它仍在被监听,因为如果我再次启动Xlet,我会得到一个带有该端口号的异常。

tcp        0      0  *.2349                 *.*                    LISTEN

1 个答案:

答案 0 :(得分:5)

有几件事需要考虑。其中一个由来自ServerSocket的JavaDoc

的以下引用描述
  

public void setReuseAddress(boolean on)                        抛出SocketException

     

启用/禁用   SO_REUSEADDR套接字选项。当TCP连接关闭时   连接可能在一段时间后保持超时状态   连接已关闭(通常称为TIME_WAIT状态或   2MSL等待状态)。对于使用众所周知的套接字地址的应用程   或端口可能无法将套接字绑定到所需的   如果在超时状态中存在连接,则为SocketAddress   套接字地址或端口。

因此,操作系统仍然可以显示在close()服务器套接字之后发生了某些事情。但是如果要经常打开/关闭同一端口上的服务器套接字,可能会出现问题。