【问题标题】:Client threads and server, server displays client 1's message, then client 2's message, then 1 etc客户端线程和服务器,服务器显示客户端 1 的消息,然后显示客户端 2 的消息,然后显示 1 等
【发布时间】:2017-09-30 06:14:10
【问题描述】:

问题:基本上对于两个客户端,服务器显示来自第一个客户端的消息,然后是第二个客户端连续显示的消息,而不显示从第一个客户端键入的多条消息,然后说来自第二个客户端的一条消息。

预期结果:能够在一个客户端上发送尽可能多的消息,然后在第二个客户端上发送不同数量的消息。

尝试解决问题的步骤:

  1. 看了几个网站的死锁问题,不知道是不是同一个问题。
  2. 尝试将客户端更改为首先获取输入流,然后获取输出流,服务器则相反
  3. 着眼于摆脱 .filter 的 lambda 语法

重现问题的步骤:

  1. 加载服务器
  2. 加载客户端 1
  3. 加载客户端 2
  4. 客户端 1 上的消息
  5. 客户端 1 上的消息
  6. 客户端 2 上的消息
  7. 因此,每个客户端只显示一条消息

public class PrintLine extends Thread {

    private ArrayList<ClientThread> al;
    private Integer count;

    public PrintLine(ArrayList<ClientThread> al, Integer count) {
        this.al = al;
        this.count = count;
    }

    @Override
    public void run() {
        boolean done = false;
        List<ClientThread> lines = new ArrayList<ClientThread>();
        while (!done) {
            al.stream().filter(x -> x.sInput == x.sInput).map(x -> x.getSInput()).forEach(sInput -> {
                try {
                    System.out.println(sInput.readUTF());
                } catch (IOException ex) {
                    Logger.getLogger(PrintLine.class.getName()).log(Level.SEVERE, null, ex);
                }
            });
        }
    }
}

项目的 GitHub 链接:https://github.com/Runite618/ChatRoomVers2/commits/multiThreading

感谢您的阅读和任何回答。

马修。

【问题讨论】:

  • 那么只有当一条消息从所有客户端都可用时,才应该打印下一轮消息?
  • 假设客户端 1 输入 2 条消息,客户端 2 输入 1 条消息,服务器将只显示来自客户端 1 的第一条消息和来自客户端 2 的消息。

标签: java multithreading server client


【解决方案1】:

发布此内容以防对其他人有帮助。

我通过根据 PrintLine 类为每个客户端创建一个单独的执行线程来解决问题,现在可以从每个客户端独立地执行消息。

马特。

【讨论】:

    猜你喜欢
    • 2013-03-18
    • 2021-09-04
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多