Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何一次读取来自多个客户端的输入?_Java_Multithreading_Server - Fatal编程技术网

Java 如何一次读取来自多个客户端的输入?

Java 如何一次读取来自多个客户端的输入?,java,multithreading,server,Java,Multithreading,Server,我正在为一个小型即时消息应用程序创建一个服务器类。当我尝试让服务器连接到单个客户机时,一切都正常,但我尝试将其扩展为连接到多个客户机。我已经测试过,它能够连接到多个客户端,但问题在于我不能同时读取所有客户端的输入 我是否需要为每个客户端打开一个新线程来不断检查输入?我觉得这样效率非常低 这是检查客户端输入的代码,这些输入目前存储在Arraylist中。我相信它类似于扫描仪,在有输入之前它不会继续代码 private void chat() throws IOException{ Stri

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

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

这是检查客户端输入的代码,这些输入目前存储在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年;线程仍然“昂贵”;意思是你不想浪费它们

因此,您可以研究使用池的解决方案。意思是:您的服务器有一个由n个线程组成的池,这些线程共同作用于m个客户端(其中m可能比n大得多)。一个起点可能是这样

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


你看:在一台服务器和几个客户端的“学习”设置中,本地机器上是否有5个线程或10个线程并不重要。当我们谈到m的值远远超过100500,…时,池就变得有趣了。。并给出了当前代码的外观;我想所有这些都是“玩弄”的。所以,在开始打硬球之前,先打垒球。

多亏了匿名投票人。你对我的问题有什么意见吗?谢谢你的快速回复。我认为我将为每个客户端打开一个新线程,并限制客户端的数量,因为我实际上不需要连接多个客户端。该教程看起来非常有用,如果需要进一步扩展,我将在将来使用它。当这个简单的示例运行时,您还可以查看java.nio包,了解如何使用一个或几个线程处理多个连接。