java - 为什么来自多个套接字的输入无法正确更新 UI?

标签 java sockets serversocket

笔记本代码:http://pastebin.com/hNgjr4QY ,服务器代码:http://pastebin.com/J5hnz2mu

我最感兴趣的是代码的笔记本部分:

private class ClientHandler implements Runnable
{
    public void run()
    {
        String message = null;

        try {
            bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            while ((message = bufferedReader.readLine()) != null)
            {
                if (!message.equals(""))
                {
                    textArea.setText(message);
                    textArea.setCaretPosition(textArea.getDocument().getLength());
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

public void run()
    {
        String message = null;

        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            while ((message = bufferedReader.readLine()) != null)
            {
                for (ComputerConnections ccc: comCon)
                {
                    ccc.printWriter.println(message);
                    ccc.printWriter.flush();
                }
            }
            bufferedReader.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

嗯,程序的重点是允许尽可能多的用户连接,并且在他们都可以在同一个记事本中写入之后,程序应该相应地更新它,嗯,看起来它的行为很奇怪。起初它更新得很好,但后来它突然停止了,并且每隔几次按键就会工作!

最佳答案

我怀疑这是一个 UI 问题,而不是您所描述的套接字问题(尽管此代码还存在其他问题)。这很容易弄清楚,只需放置一些 System.out.println() 调试行而不是 UI 写入。

如果是这种情况,您应该使用 EDT 线程,以便对 GUI 进行更改,以便唯一对 GUI 进行更改的线程是那个线程,以避免干扰,就像这样

    SwingUtilities.invokeLater( 
        new Runnable() {
            public void run() {
                textArea.setText(message);
            }
        }
    );

众所周知,UI 很难实现多线程,因此解决此问题的最佳方法是将由一个 UI 线程处理的更新排队(在 Java 中为 EDT - Event Dispatch Thread )。

关于java - 为什么来自多个套接字的输入无法正确更新 UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35843113/

相关文章:

python - 查找用于连接到我的套接字服务器的主机名

c# - 开始了解 Web 套接字和 http 请求(和 STOMP)

java - 无法通过互联网连接到 ServerSocket

java - 当我们说一个特定的数据结构是缓存友好的时,这意味着什么?

java - Geotools PolygonExtractionProcess 不起作用

java - 如何使用 System.out 作为 java 方法中的参数

c - 如何删除 CLOSE_WAIT 套接字连接?

java - 来回发送对象到线程

java - 从特定方法调用时,JFrame 中的内容不显示

java - 使用 Kotlin 扩展 java 类首选项时的多个构造函数