两个JFrame聊天系统无法建立连接,抛出java.net.ConnectException异常
解决Java Swing聊天系统的Connection refused问题
我来帮你拆解这个连接失败的核心问题——你启动客户端Socket连接的时机早于服务器端ServerSocket的创建,导致客户端尝试连接时,服务器还没准备好监听端口,自然会抛出java.net.ConnectException: Connection refused异常。
问题根源分析
看你的代码逻辑:
- 主方法里先调用了
showClient(),这个方法内部直接执行了client.startServer()(注意这个方法名有误导性,它实际是客户端发起连接的逻辑) - 客户端立刻尝试连接
127.0.0.1:1201,但此时主方法里的ss=new ServerSocket(1201)还没执行,服务器根本没开始监听端口 - 而你单独运行时,应该是先启动了服务器端代码,再启动客户端,顺序是对的,所以能正常连接
具体解决方案
1. 调整启动顺序:先启动服务器,再启动客户端
把主方法里的代码顺序调换,确保服务器先完成端口监听,再启动客户端发起连接:
try { // 第一步:先启动服务器监听端口 ss = new ServerSocket(1201); // 第二步:再启动客户端窗口并发起连接 showClient(); // 第三步:等待客户端连接 s = ss.accept(); din = new DataInputStream(s.getInputStream()); dout = new DataOutputStream(s.getOutputStream()); String msgin = ""; while(!msgin.equals("exit")){ msgin = din.readUTF(); msg_area.setText(msg_area.getText().trim()+"\n User 2: "+msgin); } } catch(Exception e) { System.out.println("Error: " + e); }
2. 修正方法命名(重要的可读性优化)
你的startServer()方法实际是客户端连接服务器的逻辑,这个命名太容易混淆,建议改成connectToServer(),避免后续维护时出错:
public static void connectToServer(){ // 原startServer()的代码逻辑 }
3. 处理线程阻塞问题(避免UI卡死)
accept()和readUTF()都是阻塞方法,直接在主线程运行会导致Swing界面无响应。需要把服务器监听、客户端连接的逻辑放到独立线程中,并且更新UI时要使用Swing事件线程:
服务器端线程改造:
// 主方法中启动服务器线程 new Thread(() -> { try { ss = new ServerSocket(1201); s = ss.accept(); din = new DataInputStream(s.getInputStream()); dout = new DataOutputStream(s.getOutputStream()); String msgin = ""; while(!msgin.equals("exit")){ msgin = din.readUTF(); // 在Swing事件线程中更新UI SwingUtilities.invokeLater(() -> { msg_area.setText(msg_area.getText().trim()+"\n User 2: "+msgin); }); } } catch (Exception e) { System.out.println("Server Error: " + e); } }).start(); // 再启动客户端 showClient();
客户端连接线程改造:
public static void connectToServer(){ new Thread(() -> { try{ s = new Socket("127.0.0.1", 1201); din = new DataInputStream(s.getInputStream()); dout = new DataOutputStream(s.getOutputStream()); String msgin = ""; while(!msgin.equals("exit")){ msgin = din.readUTF(); // 在Swing事件线程中更新UI SwingUtilities.invokeLater(() -> { msg_area.setText(msg_area.getText().trim()+"\n User 1: "+msgin); }); } } catch(Exception e){ System.out.println("Client Error: " + e); } }).start(); }
这样调整后,不仅解决了连接顺序问题,还能避免界面卡死的情况,符合Swing的UI线程规范。
内容的提问来源于stack exchange,提问作者yasser h
相关产品推荐
相关产品推荐

