我目前正在开发一个非常基本的聊天应用程序,但是当从客户端和服务器端接收字符串时遇到问题。我正在使用一个线程被动地监听套接字上的传入消息,这是我怀疑问题所在。我这样做是正确的吗?
来源: 发送字符串的代码:
send.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
messageBuffer = message.getText();
out.println(messageBuffer);
chat.append(username + ": " + messageBuffer + "\n");
message.setText("");
}
});
然后我有这个被动地倾听(问题可能在这里):
public void run(){
while(true){
try {
messageBufferIn = in.readLine();
System.out.println(in.readLine());
chat.append(recipient + ": " + messageBufferIn + "\n");
} catch (IOException e) {
e.printStackTrace();
}
}
}
我也用这个来调用线程:
public static void startChatting(){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
感谢您提供的任何帮助,我仍然是整体线程的新手,所以我的错误可能非常平庸。
编辑:问题是,当我尝试向接收器发送消息时,没有任何消息,我可以确认它们已连接。实际上是System.out.println(in.readLine());根本没有,甚至没有“空”输出。
答案 0 :(得分:3)
您遇到Concurency in Swing问题,Swing GUI不知道您在Socket
上运行/打开Background Task
,
Swing GUI
的所有更新都必须在EDT上完成,否则没有任何更新或您有一些例外情况
必须将所有更新从Background Task
(在您的情况下为Runnable#Thread
)包装到invokeLater
for Swing GUI
while(true){
是无限循环放置Boolean variable
而不是true
,然后您可以停止,启动或重新启动您的Socket
如果send.addActionListener(new ActionListener(){
只运行一次(如果用户通过JButtons
点击调用)然后使用SwingWoker打开套接字,SwingWorker
相当不错保证所有输出都应在EDT上完成
Runnable#Thread
和SwingWorker
之间的区别在于SwingWorker
被指定仅运行一次
答案 1 :(得分:2)
我怀疑你的主要问题是你没有冲洗OutputStream
。在您完成写入并希望发送消息后,您需要添加out.flush()
。例如,您的ActionListener
将如下所示:
send.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
messageBuffer = message.getText();
out.println(messageBuffer);
out.flush();
chat.append(username + ": " + messageBuffer + "\n");
message.setText("");
}
});
如果你不这样做,你的OutputStream
会坐在那里直到它的缓冲区已满(这将是很多消息)。