【问题标题】:How to read inputs from multiple clients at one time?如何一次读取多个客户端的输入?
【发布时间】:2017-02-17 14:01:08
【问题描述】:

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

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

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

}

【问题讨论】:

  • 当你有这个简单的例子工作时,你还可以查看 java.nio 包,了解如何处理一个或几个线程的多个连接。

标签: java multithreading server


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢匿名投票者。您认为应该如何改进我的问题?
  • 感谢您的快速回复。我认为我将为每个客户端打开一个新线程并限制客户端数量,因为我真的不需要连接多个客户端。该教程看起来很有帮助,如果我需要进一步扩展,我将在未来使用它。
猜你喜欢
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多