gpt4 book ai didi

java - 在服务器上关闭 AtomicBoolean ching 太晚了(Java)

转载 作者:行者123 更新时间:2023-12-02 08:44:43 26 4
gpt4 key购买 nike

我正在开发客户端-服务器应用程序,我想在通过套接字收到停止消息时关闭服务器。我的服务器的代码如下所示

public class Server extends Thread {

private AtomicBoolean running = new AtomicBoolean(true);


public synchronized void setRunning(boolean value){
running.set(value);
}

public void run(){

while(running.get()){
try {
clientSocket = serverSocket.accept();
//doing stuff...

}catch (IOException e) {
logger.error("{} \n",e.getMessage());
}
}

变量 running 在另一个处理我的消息的类中设置。函数是这样写的

public synchronized void onReceive(Message message){

if(message.equals(stopMessage)){

server.setRunning(false);
for(Client c : clients)
c.shutdown();
server.shutdown();
}
}

我的问题是,服务器中的 while 循环在将运行变量设置为 false 之前再执行一次迭代,并且服务器尝试检查套接字,即使它认为它为空,因为连接到该套接字的客户端已经关闭(客户端已关闭)也是一个线程)。我做错了什么,但我不知道是什么。有任何想法吗?谢谢你!

最佳答案

像这样更改您的 while 循环:

while( running.get() )
{
try( clientSocket = serverSocket.accept() )
{
if( !running.get() ) break;
//doing stuff...

}
catch( SocketTimeoutException e )
{
continue;
}
catch( SocketException e )
{
if( !serverSocket.isClosed() ) logger.error( "{} \n", e.getMessage() );
break;
}
catch( IOException e )
{
logger.error( "{} \n", e.getMessage() );
break;
}
}

循环正在 serverSocket.accept() 中等待,并且仅在传入连接或超时时才会继续。更改 running 不会唤醒它,因此它仅在 while 循环中的下一个周期识别该更改。

并且在错误异常之后,您不应该继续循环。即使出现 SocketTimeoutException 情况,继续 也可能不正确/充分。

关于java - 在服务器上关闭 AtomicBoolean ching 太晚了(Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61154620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com