Java 如何一次读取来自多个客户端的输入?
我正在为一个小型即时消息应用程序创建一个服务器类。当我尝试让服务器连接到单个客户机时,一切都正常,但我尝试将其扩展为连接到多个客户机。我已经测试过,它能够连接到多个客户端,但问题在于我不能同时读取所有客户端的输入 我是否需要为每个客户端打开一个新线程来不断检查输入?我觉得这样效率非常低 这是检查客户端输入的代码,这些输入目前存储在Arraylist中。我相信它类似于扫描仪,在有输入之前它不会继续代码Java 如何一次读取来自多个客户端的输入?,java,multithreading,server,Java,Multithreading,Server,我正在为一个小型即时消息应用程序创建一个服务器类。当我尝试让服务器连接到单个客户机时,一切都正常,但我尝试将其扩展为连接到多个客户机。我已经测试过,它能够连接到多个客户端,但问题在于我不能同时读取所有客户端的输入 我是否需要为每个客户端打开一个新线程来不断检查输入?我觉得这样效率非常低 这是检查客户端输入的代码,这些输入目前存储在Arraylist中。我相信它类似于扫描仪,在有输入之前它不会继续代码 private void chat() throws IOException{ Stri
private void chat() throws IOException{
String message = " You are now connected! ";
sendMessage(message);
ableToType(true);
do{
try{
//right now it is only checking the first (0) client
message = (String) inputs.get(0).readObject(); // this is the line that checks for inputs
showMessage("\n" + message, new java.awt.Color(20, 124, 34));
}catch(ClassNotFoundException classNotFoundException){
showMessage("\nUnreadable Message Sent by Client");
}
}while(!message.contains("END"));
}
简单的解决方案是:在服务器上分配一个完整的线程。。。每个客户 但正如您已经想到的:这是相当低效的——因为您的大多数线程在大部分时间都处于空闲状态。甚至在2016年;线程仍然“昂贵”;意思是你不想浪费它们 因此,您可以研究使用池的解决方案。意思是:您的服务器有一个由n个线程组成的池,这些线程共同作用于m个客户端(其中m可能比n大得多)。一个起点可能是这样 但是:如果你这样做是为了“学习目的”;然后我建议:首先采用“每个客户端一个线程”的方法。您知道,要使这种实现正常工作将是一项具有挑战性的任务(多线程很快转化为多问题)。先解决这个难题;只有使用池才能进入下一个级别
你看:在一台服务器和几个客户端的“学习”设置中,本地机器上是否有5个线程或10个线程并不重要。当我们谈到m的值远远超过100500,…时,池就变得有趣了。。并给出了当前代码的外观;我想所有这些都是“玩弄”的。所以,在开始打硬球之前,先打垒球。多亏了匿名投票人。你对我的问题有什么意见吗?谢谢你的快速回复。我认为我将为每个客户端打开一个新线程,并限制客户端的数量,因为我实际上不需要连接多个客户端。该教程看起来非常有用,如果需要进一步扩展,我将在将来使用它。当这个简单的示例运行时,您还可以查看java.nio包,了解如何使用一个或几个线程处理多个连接。