我目前正在开发一个总体上非常基础的聊天应用程序,但是我在从客户端和服务器端接收字符串时遇到了问题。我正在使用一个线程在套接字上被动地监听传入消息,这就是我怀疑的问题所在。我这样做的方式正确吗?
来源: 发送字符串代码:
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());根本没有通过,甚至没有“空”输出。
最佳答案
您遇到了 Concurency in Swing 问题,Swing GUI 不知道您在
<后台任务
上运行/打开Socket
,Swing GUI
的所有更新都必须在 EDT 上完成,否则什么也不会发生,或者您会遇到一些异常必须将所有更新从
后台任务
(在您的情况下为Runnable#Thread
)包装到invokeLater
for Swing GUIwhile(true){
是无限循环,把Boolean variable
而不是true
,然后你可以停止,开始或根据您的情况重新启动Socket
在
send.addActionListener(new ActionListener(){
仅运行一次的情况下(如果用户通过JButtons
单击调用)则使用 SwingWoker打开 Socket,SwingWorker
很好的保证了所有的输出都应该在 EDT 上完成
<Runnable#Thread
和SwingWorker
的区别在于SwingWorker
被指定为只运行一次
关于java - 被动监听聊天应用程序的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12090378/