SocketException:socket关闭 [英] SocketException: socket closed

查看:245
本文介绍了SocketException:socket关闭的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Java Sockets创建一个聊天应用程序,并在关闭服务器时收到 SocketException:socket关闭。我收到错误即使我没有尝试连接客户端 - 只是停止服务器将有这个套接字封闭的异常。



我知道错误是什么意思,一旦它已经关闭,我试图访问套接字,但是我不知道为什么会发生这种情况。

  public ServerSocket server_socket; 
new ConnectionThread(server_back_end);

class ConnectionThread extends Thread实现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(异常e)
{
e.printStackTrace(); //当我停止服务器

} // end run()

我认为问题在add_incoming_clients()中,因为当我注释掉调用时,它不会抛出错误。即使我没有处理任何客户,发生在 accept()方法中的事情:

  public void add_incoming_clients()throws IOException,ClassNotFoundException 
{
Socket client_socket = server_back_end.server_socket.accept(); // line 172

ClientInfo new_client = new ClientInfo(
new ObjectOutputStream(client_socket.getOutputStream()),
new ObjectInputStream(client_socket.getInputStream()));
// ...
// ...
}

以下是停止服务器时的代码::

  public void stop()
{
if(running)
try
{
running = false;
server_socket.close();
server_front_end.display(<< SERVER TERMINATED>>);
}
catch(IOException e)
{
System.out.println(停止服务器异常,不是问题);
}
} // end stop()

有人可以解释一下必须做到正确关闭它没有例外?
这是错误(第172行是罪魁祸首,但我不明白为什么)

  java .net.SocketException:java.net.DualStackPlainSocketImpl.accept0(Native Method)上的套接字关闭
java.net.DualStackPlainSocketImpl.socketAccept(DualStackPlainSocketImpl.java:131)
java.net上的
.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409)
在java.net.PlainSocketImpl.accept(PlainSocketImpl.java:199)
在java.net.ServerSocket.implAccept(ServerSocket.java:545)
在java.net.ServerSocket.accept(ServerSocket.java:513)
在ConnectionThread.add_incoming_clients(ServerBackEnd.java:172)
在ConnectionThread.run(ServerBackEnd.java:159)


解决方案

这个例外是你的朋友。它释放等待ServerSocket.accept()的线程,正确的处理将让您清理所有需要清理的内容,然后完全关闭...您需要像朋友一样对待它:)


I am creating a Chat application with Java Sockets, and am getting the SocketException: socket closed when closing the server. I receive the error even if I never attempt to connect clients- just stopping the server will have this socket closed exception.

I know what the error means, I'm trying to access the socket once it has already been closed, but I can't figure out why this would happen.

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()

I think the problem is in the add_incoming_clients(), because when I comment out the call, it does not throw the error. Even though I am not dealing with any clients, something happens at the accept() method:

    public void add_incoming_clients() throws IOException, ClassNotFoundException
    {
        Socket client_socket = server_back_end.server_socket.accept(); //line 172

        ClientInfo new_client = new ClientInfo(
                new ObjectOutputStream(client_socket.getOutputStream()),
                new ObjectInputStream(client_socket.getInputStream()));
     //...
     //...
    }

Here is the code when I stop the server::

 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()

Can someone explain what I must do to close it properly without an exception? Here is the error (line 172 is the culprit it seems, but I don't understand why)

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)

解决方案

This Exception is your friend. It releases the thread that's waiting on ServerSocket.accept(), and proper handling will let you clean up whatever needs to be cleaned up before you shut down completely... You need to treat it like a friend :)

这篇关于SocketException:socket关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆