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

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

尝试解决问题所采取的步骤:

  1. 查看了几个有关死锁的网站,不确定这是否是同一件事。
  2. 尝试将客户端更改为首先获取输入流,然后再获取输出流,服务器则相反
  3. 考虑摆脱 lambda 语法中的 .filter

重现问题的步骤:

  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

感谢您的阅读和回答。

马修。

请您参考如下方法:

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

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

马特。


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!