我正在尝试在java中创建一个简单的TCP客户端和宿主聊天程序。它们都运行在简单的GUI中。在我启动服务器之后,它等待来自客户端的连接,然后在其JtextArea中打印出一条消息。服务器成功执行此操作,一切都运行罚款,直到这里,现在我将一些数据发送到它应该在其JtextArea上打印的客户端,但是客户端从连接时间停留,连接按钮保持按下状态只是冻结。
这里是客户端连接按钮代码,我想我在这里做错了什么
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;
答案 0 :(得分:3)
您的连接按钮保持按下的原因是您正在阻挡您的画线。看看the concurrency in Swing tutorial。要点是Swing中的所有GUI事件都在绘制线程中发布,如果您想要执行任何阻塞任务(即服务器调用)或任何其他长时间运行的进程,您应该将您的进程分解为单独的任务。执行或触发绘制GUI的所有任务都应该通过绘制线程完成。长时间运行的任务应该在后台线程中完成。 SwingWorker
是Java为此类设计提供的一种结构。
目前,您的jButton2MouseClicked
方法正在绘制线程中运行,并且不允许您的应用继续绘制,包括解冻连接按钮,直到您的服务器调用完成。