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