Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 当代码保持接受新套接字时,如何检查某些变量?_Java_Sockets_Synchronization - Fatal编程技术网

Java 当代码保持接受新套接字时,如何检查某些变量?

Java 当代码保持接受新套接字时,如何检查某些变量?,java,sockets,synchronization,Java,Sockets,Synchronization,在我制作的应用程序中,服务器接受来自客户端的套接字连接并执行各种工作。客户端列表存储在clients中,该列表具有LinkedList类型 我使用while语句和基于客户机队列大小的条件语句 我想知道是否有办法解决下面描述的问题。。。这样服务器就不会永远挂起 while(clients.size()>0){ //few clients the queue is alive at the moment //Suddenly, all clients in the queue shut

在我制作的应用程序中,服务器接受来自客户端的套接字连接并执行各种工作。客户端列表存储在
clients
中,该列表具有
LinkedList
类型

我使用while语句和基于
客户机
队列大小的条件语句

我想知道是否有办法解决下面描述的问题。。。这样服务器就不会永远挂起

while(clients.size()>0){ //few clients the queue is alive at the moment
    //Suddenly, all clients in the queue shut down at this point in the while loop,
    //Another thread, which checks clients knows that clients are dead
    //so clients.size() becomes 0, but there is no way to check that at this point
    //and server is expecting for connection clients forever

    Socket socket= server.accept();
    socket.close();
}
//printout results
编辑

客户机列表不仅仅是现有客户机。它是活动客户端的列表。此列表由另一个线程更新

我有上面的while语句,因为我想在没有活着的客户之后做一些工作。(要么完成了工作,要么就死了)


我想在不使用超时异常的情况下解决这个问题,因为客户端将在随机时间内响应。(同样,客户端的活动性由另一个线程使用心跳技术进行检查)

我对您的循环条件没有任何意义。为什么只有在现有客户的情况下,你才会对接受新客户感兴趣?这个过程是如何开始的


但是,一般来说,在ServerSocket上设置超时将允许accept()方法在这些时间间隔内抛出SocketTimeoutException,这样您就可以测试需要测试的任何内容。

我不确定我是否完全理解了您的问题,但假设以下几点可行。第一个假设是,您的客户机类中有一个标志alive,指示它是活动的还是死的

while(clients.size()>0){
    client = clients.remove();
    if (client.isAlive()) {
        Socket socket= server.accept();
        socket.close();
    }
}

您可以在
ServerSocket
上设置超时,并捕获
SocketTimeoutException

server.setSoTimeout(1000);
while (clients.size() > 0) {
    try {
        server.accept();
    }
    catch (SocketTimeoutException e) {
        // Ignore
    }
}
这样,您将每隔一秒钟左右检查客户机列表的状态


如果有其他线程访问
客户端,请不要忘记同步对它的访问。使用集合。synchronizedList将其包装起来,或者在代码中访问变量的部分进行适当的同步。

看起来需要在客户端上进行同步,以便在已知点更改客户端的大小。

在所有客户端都已启动时,使用额外的线程停止serversocket怎么样走了?:)差不多

new Thread() {
    public void run() {
        if (clients.isEmpty()) {
            try { server.close();} catch (IOException e){...}
        }
    }
}.start();

while(clients.size()>0){ 
    if (!clients.isEmpty()) {
        Socket socket= server.accept();
        socket.close();
    }
}

if
if(client.isAlive())怎么办{
通过后,客户端在被服务器接受之前立即死亡?通常会配置一个TimeoutException来处理这种情况。所以请检查Cameron所说的。应该是
接受活动客户端之间的连接,而存在现有的活动客户端
。但不
接受新客户端当存在现有客户端时
@user482594该语句在术语上是矛盾的。请再试一次。user482594:我强烈怀疑@EJP对分布式系统的理解相当好。当服务器无法知道客户端请求与服务器的连接需要多长时间时,设置超时非常理想。唯一的替代方法是等待永远。你为什么想要一个不使用超时的解决方案?使用
SocketTimeoutException
没有什么错。你可以在循环中捕获它并适当地处理它(请参阅我的答案以获取示例)。如果愿意,您也可以为不同的套接字设置不同的超时。因为..客户端必须以其处理的结果响应服务器。根据提供给客户端的参数,这可能需要1秒或1分钟。这就是我使用活动客户端管理客户端队列的原因。此列表由另一个线程更新。是的,但y你可以在循环中等待下一个连接时有一个超时。超时并不意味着你放弃下一个客户端,它只是让你有机会检查你是否应该继续等待。无限期等待几乎总是一个坏主意。如果客户端崩溃,或者在响应前断电,会发生什么?如果你有什么问题呢e网络问题?如果你正在编写一个健壮的系统,你需要能够处理这些情况。基本上,如果你没有超时,那么你对
socket的调用将永远等待。接受
将永远等待。这真的是你想要的吗?我现在明白了你的想法。非常感谢你。我以为超时是删除服务器套接字而不接受任何套接字还有…我真的很抱歉。