1

我有一些类似于此的 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 微版本运行时编程。还值得注意的是,我让这个方法在另一个线程中运行,并且我正在尝试从其父线程关闭套接字。

编辑这是来自 netstat 的行,尽管我可以向您保证它仍在被监听,因为如果我再次启动 Xlet,我会收到该端口号的异常。

tcp        0      0  *.2349                 *.*                    LISTEN
4

1 回答 1

6

有几件事情需要考虑。其中之一由 ServerSocket 的 JavaDoc 的以下引用描述

public void setReuseAddress(boolean on) 抛出 SocketException

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

所以操作系统仍然可以显示close()服务器套接字之后发生了一些事情是可以的。但是,如果您要频繁打开/关闭同一端口上的服务器套接字,您可能会遇到问题。

于 2011-07-21T00:14:59.013 回答