【问题标题】:How to close a socket if it's listening to a connection如果正在侦听连接,如何关闭套接字
【发布时间】:2016-09-27 14:44:09
【问题描述】:

当我按下 GUI 中的停止按钮时,我想关闭我的服务器。我将此代码用于套接字,它正在侦听客户端是否连接到 serverSocket:

public void run() {
        while (running) {
            try {
                if (serverSocketPassed) {
                    socket = serverSocket.accept();
                    scanner = new Scanner(socket.getInputStream());
                    stream = new PrintStream(socket.getOutputStream());
                }
            } catch (IOException e) {
                System.out.println("err11");
                e.printStackTrace();
            }
        }

    }

结束部分的代码如下所示:

public void stop() {
    try {
            serverSocket.close();
            running = false;
        } catch (Exception e) {
            System.out.println("Err");
            e.printStackTrace();
        }
        scanner.close();
        stream.close();
}

但是当我调用停止函数时,在客户端连接之前:我得到一个错误。 这是错误:

err11
java.net.SocketException: socket closed
    at java.net.DualStackPlainSocketImpl.accept0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketAccept(Unknown Source)
    at java.net.AbstractPlainSocketImpl.accept(Unknown Source)
    at java.net.PlainSocketImpl.accept(Unknown Source)
    at java.net.ServerSocket.implAccept(Unknown Source)
    at java.net.ServerSocket.accept(Unknown Source)
    at _47b3n.server.main.Server$SocketRunner.run(Server.java:93)
    at java.lang.Thread.run(Unknown Source)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at _47b3n.server.main.Server.stop(Server.java:42)
    at _47b3n.server.main.ServerGUI$ActionListener.actionPerformed(ServerGUI.java:166)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

如何正确关闭服务器及其组件?

【问题讨论】:

  • scannerstream 未定义;检查null。至于你的“SocketException: socket closed”错误——你必须忍受它;如果套接字在您等待它时关闭,这就是您得到的结果 - 抓住 Exception 并很好地记录它。

标签: java sockets server


【解决方案1】:

不要突然关闭服务器套接字,而是关闭流。

试试这个:

stream.close();

【讨论】:

    猜你喜欢
    • 2013-02-15
    • 2016-11-19
    • 2011-12-10
    • 2011-04-20
    • 2013-01-04
    • 2021-09-14
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    相关资源
    最近更新 更多