Java 服务器中读取所有客户端套接字的循环
假设我有一个类ServerReader,它是一个一直运行的线程。ServerReader有一个循环,以如下方式从所有客户端读取所有消息: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
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
。在插座的使用寿命内使用相同的插座。