3

我目前正在开发一个总体上非常基本的聊天应用程序,但是在从客户端和服务器端接收字符串时遇到问题。我正在使用一个线程被动地在套接字上侦听传入消息,这是我怀疑问题所在。我这样做对吗?

来源:发送字符串的代码:

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()); 根本没有通过,甚至没有“空”输出。

4

2 回答 2

3
  1. 在 Swing 中遇到 Concurency问题,Swing GUI 不知道您正在运行/打开Socketon Background Task

  2. Swing GUI必须在EDT上完成所有更新,否则什么也没有发生,或者你有一些例外

  3. 必须将所有更新从Background Task(在您的情况下Runnable#Thread)包装到invokeLater for Swing GUI

  4. while(true){是无限循环放在那里Boolean variable而不是true,那么你可以停止,启动或重新启动你的情况Socket

  5. send.addActionListener(new ActionListener(){只运行一次的情况下(如果用户通过JButtons点击调用)然后使用SwingWoker打开 Socket,SwingWorker很好的保证所有输出都应该在 EDT 上完成

  6. Runnable#Thread和之间的区别SwingWorkerSwingWorker指定只运行一次

于 2012-08-23T11:51:24.763 回答
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将坐在那里直到缓冲区已满(这将是很多消息)。

于 2012-08-24T02:52:02.533 回答