Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SocketException:套接字已关闭_Java_Sockets_Exception - Fatal编程技术网

Java SocketException:套接字已关闭

Java SocketException:套接字已关闭,java,sockets,exception,Java,Sockets,Exception,我正在创建一个带有Java套接字的聊天应用程序,并且在关闭服务器时得到SocketException:socketclosed。我收到错误,即使我从未尝试连接客户端-仅停止服务器将关闭此套接字异常 我知道这个错误意味着什么,我试图在套接字关闭后访问它,但我不明白为什么会发生这种情况 public ServerSocket server_socket; new ConnectionThread(server_back_end); class ConnectionThread extends Th

我正在创建一个带有Java套接字的聊天应用程序,并且在关闭服务器时得到
SocketException:socketclosed
。我收到错误,即使我从未尝试连接客户端-仅停止服务器将关闭此套接字异常

我知道这个错误意味着什么,我试图在套接字关闭后访问它,但我不明白为什么会发生这种情况

public ServerSocket server_socket;
new ConnectionThread(server_back_end);

class ConnectionThread extends Thread implements Runnable, Serializable
{
    public ServerBackEnd server_back_end;

    public ConnectionThread(ServerBackEnd server_back_end) /*constructor*/
    {
        this.server_back_end = server_back_end;
        start();
    }

    @Override
    public void run()
    {
        try
        {
            server_back_end.server_socket = new ServerSocket(8080);
            server_back_end.server_front_end.display("<<SERVER STARTED>>");

            while (server_back_end.running)
                add_incoming_clients();
        }
        catch (Exception e)
        {
            e.printStackTrace(); //this gets thrown when I stop server
        }
    }//end run()
以下是我停止服务器时的代码::

 public void stop()
    {
        if (running)
            try
            {
                running = false;
                server_socket.close();
                server_front_end.display("<<SERVER TERMINATED>>");
            }
            catch (IOException e)
            {
                System.out.println("stop server exception, is not the problem");
            }
    }//end stop()

这个例外是你的朋友。它会释放等待ServerSocket.accept()的线程,适当的处理将允许您在完全关闭之前清理所有需要清理的内容。。。您需要像对待朋友一样对待它:)

查看跟踪和代码,无论何时停止(),您应该做的第一件事是通知连接线程让其停止活动,然后在知道连接线程已死亡后立即继续使用stop方法


可能发生的情况是,当连接线程正在使用套接字时,停止力会关闭套接字。你可以在轨迹上看到这一点

哦!我不知道!我试图尽可能正确地编程,并认为这个异常不是“朋友”。你解释了为什么会是现在,这是有道理的。谢谢@用户3487243不客气。顺便说一句,您可能希望将代码更改为catch(SocketException ex)以捕获此异常,而不是其他类型的异常。它还可以“用代码记录”正在发生的事情。就运行程序而言,我想这不会有太大的区别吧?它只是为了明确地捕捉一个特定的exception@user3487243对就像我说的,这会让下一个拿起你的代码的人更清楚,我如何通知连接线程?我想我只能关闭套接字,然后上路了?线程之间有几种通信机制。您可以共享一个变量标志,并在该标志变为true或false时使线程停止(并在stop()函数中编辑该标志)。这就是他们在这里的建议:啊,是的。我使用运行的布尔变量。谢谢你的提醒!
 public void stop()
    {
        if (running)
            try
            {
                running = false;
                server_socket.close();
                server_front_end.display("<<SERVER TERMINATED>>");
            }
            catch (IOException e)
            {
                System.out.println("stop server exception, is not the problem");
            }
    }//end stop()
java.net.SocketException: socket closed
    at java.net.DualStackPlainSocketImpl.accept0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketAccept(DualStackPlainSocketImpl.java:131)
    at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:199)
    at java.net.ServerSocket.implAccept(ServerSocket.java:545)
    at java.net.ServerSocket.accept(ServerSocket.java:513)
    at ConnectionThread.add_incoming_clients(ServerBackEnd.java:172)
    at ConnectionThread.run(ServerBackEnd.java:159)