2012-08-23 48 views
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());完全没有通过,甚至没有“空”输出。

+0

问题是什么......? – user1329572

+0

也许[this](http://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html)会帮助.. – user1329572

+0

@ user1329572我已经被告知使用while循环在数据套接字上侦听时是一个坏的CPU堵塞。这是正确的,还是这是唯一的方法? – Andrei0427

回答

3
  1. 你有问题与Concurency in Swing,Swing GUI的不知道你运行/打开SocketBackground Task

  2. 所有更新的Swing GUI必须EDT要做,否则什么都没有发生或你有几个例外

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

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

  5. 的情况下

    send.addActionListener(new ActionListener(){只有一次时间(如果用户通过JButtons点击调用运行),然后用SwingWoker打开插座,SwingWorker相当不错的保证,所有的输出应该在美国东部时间做

  6. 差异中间人Runnable#ThreadSwingWorkerSwingWorker被指定为只运行一次次

+0

另请参阅此工作[示例](http://stackoverflow.com/a/3245805/230513)。 – trashgod

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坐在那里,直到它的缓冲区满(这将是一个很大的消息)。