gpt4 book ai didi

java - 如何一次读取多个客户端的输入?

转载 作者:行者123 更新时间:2023-12-03 12:47:18 25 4
gpt4 key购买 nike

我正在为一个小型即时消息应用程序创建一个服务器类。当我尝试让服务器连接到单个客户端时,一切正常,但我试图将其扩展为连接到多个客户端。我已经测试过,它能够连接到多个客户端,但问题在于我无法同时读取所有客户端的输入。

我是否需要为每个客户端打开一个新线程以不断检查输入?我觉得这样效率极低。

这是检查来自客户端的输入的代码,这些输入目前存储在 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"));

}

最佳答案

简单的解决方案是:您在服务器上为每个客户端提供一个完整的线程。

但正如您已经想到的那样:这是相当低效的 - 因为您的大多数线程大部分时间都处于空闲状态。甚至在 2016 年;线程仍然“昂贵”;这意味着您不想浪费它们。

因此,您可能正在研究使用池化 的解决方案。意思是:你的服务器有一个 pool n 个线程,它们一起在 m 个客户端上工作(其中 m 可能比 n 大得多)。一个起点可以是这个 tutorial .

但是:如果您这样做是为了“学习目的”;那么我建议:首先采用“每个客户端一个线程”的方法。你看,要让这种实现正常工作将是一项具有挑战性的任务(多线程很快就会转化为多问题)。先解决那个难题;然后才使用池进入下一个级别!

您会看到:在具有一台服务器和少量客户端的“学习”设置中,本地计算机上有 5 个线程还是 10 个线程真的无关紧要。当我们谈论 m 的值远远超过 100、500 ......并考虑到您当前代码的样子时,池化变得很有趣;无论如何,我认为所有这些都是“玩弄”。因此,先打垒球再打硬球。

关于java - 如何一次读取多个客户端的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39936404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com