Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.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_Multithreading_Sockets_Connection - Fatal编程技术网

Java 服务器中读取所有客户端套接字的循环

Java 服务器中读取所有客户端套接字的循环,java,multithreading,sockets,connection,Java,Multithreading,Sockets,Connection,假设我有一个类ServerReader,它是一个一直运行的线程。ServerReader有一个循环,以如下方式从所有客户端读取所有消息: while(true) { for(Socket socket: sockets_arraylist) { ObjectInputStream object_stream = new ObjectInputStream(socket.getInputStream()); String str = (String) obj

假设我有一个类ServerReader,它是一个一直运行的线程。ServerReader有一个循环,以如下方式从所有客户端读取所有消息:

while(true) {
    for(Socket socket: sockets_arraylist) {
        ObjectInputStream object_stream = new ObjectInputStream(socket.getInputStream());
        String str = (String) object_stream.readObject();
        System.out.println("message from client: " + str);
        object_stream.close();
    }
}
据我所知,当循环遇到readObject()方法时,线程将一直处于休眠状态,直到客户端实际发送对象为止。 想象一下这个场景: ArrayList“sockets\u ArrayList”包含2个套接字。列表中的第二个套接字,属于等待接收消息的2号客户端。客户端2发送此消息并等待服务器读取。但有一个问题:上面的循环停留在readObject()方法上,等待来自客户端1的消息。因此,在客户端1不向服务器发送消息之前,不会读取客户端2的消息


我是否需要在服务器上为每个客户端创建一个单独的线程?还是有别的解决办法

有两种解决方案:

1) 为每个客户端使用单独的线程

2) 使用异步IO-在这种情况下,您可能需要


对于每个客户端使用单独的线程可能在概念上更简单,但这意味着您需要更仔细地考虑竞争条件。使用NIO可能更具可扩展性(不同的基准测试显示不同的结果,这也可能取决于您的操作系统,取决于线程和调度的成本。)

有两种解决方案:

1) 为每个客户端使用单独的线程

2) 使用异步IO-在这种情况下,您可能需要


对于每个客户端使用单独的线程可能在概念上更简单,但这意味着您需要更仔细地考虑竞争条件。使用NIO可能更具可扩展性(不同的基准测试显示不同的结果,这也可能取决于您的操作系统,线程和调度的成本有多高。)

不要每次读取套接字时都创建一个新的
ObjectInputStream
。在套接字的生命周期中使用相同的方法。不要每次读取套接字时都创建新的
ObjectInputStream
。在插座的使用寿命内使用相同的插座。