笔记本代码: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/