被动地在套接字上侦听聊天应用程序

时间:2012-08-23 11:18:13

标签: java swing sockets concurrency event-dispatching

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

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

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

2 个答案:

答案 0 :(得分:3)

  1. 您遇到Concurency in Swing问题,Swing GUI不知道您在Socket上运行/打开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打开套接字,SwingWorker相当不错保证所有输出都应在EDT上完成

  6. Runnable#ThreadSwingWorker之间的区别在于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会坐在那里直到它的缓冲区已满(这将是很多消息)。