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



假设我有一个类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_ArrayList"包含2个套接字。列表中的第二个套接字,属于等待接收消息的2号客户端。2号客户端发送此消息并等待服务器读取。但有一个问题:上面的循环停留在等待来自客户端1的消息的readObject()方法上。所以直到客户端1将不向服务器发送他的消息,客户端2的消息才会被读取。

我需要在服务器上为每个客户端制作一个单独的线程吗?或者还有其他解决方案?

有两种解决方案:

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

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

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

最新更新