我正在为一个小型Instant Messaging应用程序创建一个服务器类。当我尝试将服务器连接到单个客户端时,一切正常,但我试图将其扩展为连接到多个客户端。我已经测试过,它可以连接到多个客户端,但问题在于我无法同时读取所有客户端的输入。
我是否需要为每个客户打开一个新线程以不断检查输入?我觉得这样效率非常低。
这是检查客户端输入的代码,此时客户端存储在Arraylist中。我相信它类似于扫描仪,在有输入之前它不会继续代码。
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"));
}
答案 0 :(得分:0)
简单的解决方案是:您在服务器上为每个客户端提供一个完整的主题。
但正如你已经想到的那样:效率相当低 - 因为大多数时候你的大多数线程都会闲置。甚至在2016年;线程仍然很昂贵&#34 ;;这意味着你不想浪费它们。
因此,您可以查看使用合并的解决方案。含义:您的服务器有一个池的 n 个线程,它们可以在 m 客户端上工作(其中m可能比n大得多)。一个起点可能是tutorial。
但是:如果你这样做是为了学习目的&#34 ;;然后我建议:去每个客户端使用一个线程"首先接近。你知道,让这种实现正常工作将是一项具有挑战性的任务(多线程很快转化为多问题)。首先解决这个难题;然后才使用游泳池进入下一个级别!
你会看到:在"学习"使用一台服务器和少数客户端进行设置,如果您的本地计算机上有5个线程或10个线程,那么这无关紧要。当我们讨论 m 超过100,500,...的值时,汇集变得有趣,并给出了当前代码的样子;我认为所有这些都是"玩耍"无论如何。所以在开始强硬之前就开始打垒球了。