2010-02-13 77 views
1

我试图使一个简单的Java TCP客户机和主机聊天程序。他们都在简单的GUI中运行。在我启动服务器之后,它会等待来自客户端的连接,然后在其JtextArea中输出一条消息。服务器执行此操作成功地,一切都运行的罚款,直到这里,现在我发送一些数据,它应该打印在其JTextArea中的客户端,但客户端已连接发生的时间卡,连接按钮保持按下它只是冻结。java的插座问题

这里是客户端连接按钮的代码,我想我在这里做得不对

private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {          
    serverName = t3.getText(); 
    serverPort = Integer.parseInt(t4.getText()); 
    try { 

     tb.append("\nconnecting...>\n"+temp); 
     connect2Server(); 
     temp = in.readLine(); 
     tb.append(temp); 

    } catch (IOException ex) { 
     tb.append(ex.toString()); 
     Logger.getLogger(DesktopApplication1View.class.getName()).log(Level.SEVERE, null, ex); 
    } 

}  

    private void connect2Server() throws IOException{ 
     try{ 
     skt = new Socket(serverName,serverPort); 
      in = new BufferedReader(new 
      InputStreamReader(skt.getInputStream())); 
     } 
     catch(UnknownHostException uh){ 
      tb.append(uh.toString()); 
     } 
     catch(IOException io){ 
      tb.append(io.toString()); 
     } 
    } 

//vars 
BufferedReader in; 
Socket skt; 

回答

3

为什么你的连接按钮在按下的原因是,你阻止你的画线。看看the concurrency in Swing tutorial。要点是Swing中的所有GUI事件都是在绘制线程中发布的,如果要执行任何阻塞任务(即服务器调用)或任何其他长时间运行的进程,则应该将进程分解为单独的任务。执行或触发绘制GUI的所有任务应通过绘画线程完成。长时间运行的任务应该在后台线程中完成。 SwingWorker是Java为这种设计提供的一种构造。

目前,您jButton2MouseClicked方法被在画线运行,不会让你的应用程序继续作画,包括您的连接按钮的解冻,直到你的服务器调用完成。