首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用ServerSocket.close()是否足以关闭端口?

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

Stack Overflow用户
提问于 2011-07-21 00:02:52
回答 1查看 2.8K关注 0票数 1

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

代码语言:javascript
复制
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;

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

我正在为Java1.4.2微版本运行时编程。同样值得注意的是,我在另一个线程中运行了这个方法,并且我正在尝试从它的父线程关闭套接字。

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

代码语言:javascript
复制
tcp        0      0  *.2349                 *.*                    LISTEN
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-21 00:14:59

有几件事要考虑。其中之一由JavaDoc of ServerSocket的下列引文描述

公共空setReuseAddress(布尔值on)抛出SocketException

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6769934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档