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

时间:2016-10-08 19:18:29

标签: java multithreading server

我正在为一个小型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"));

}

1 个答案:

答案 0 :(得分:0)

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

但正如你已经想到的那样:效率相当低 - 因为大多数时候你的大多数线程都会闲置。甚至在2016年;线程仍然很昂贵&#34 ;;这意味着你不想浪费它们。

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

但是:如果你这样做是为了学习目的&#34 ;;然后我建议:去每个客户端使用一个线程"首先接近。你知道,让这种实现正常工作将是一项具有挑战性的任务(多线程很快转化为多问题)。首先解决这个难题;然后才使用游泳池进入下一个级别!

你会看到:在"学习"使用一台服务器和少数客户端进行设置,如果您的本地计算机上有5个线程或10个线程,那么这无关紧要。当我们讨论 m 超过100,500,...的值时,汇集变得有趣,并给出了当前代码的样子;我认为所有这些都是"玩耍"无论如何。所以在开始强硬之前就开始打垒球了。