You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两个JFrame聊天系统无法建立连接,抛出java.net.ConnectException异常

解决Java Swing聊天系统的Connection refused问题

我来帮你拆解这个连接失败的核心问题——你启动客户端Socket连接的时机早于服务器端ServerSocket的创建,导致客户端尝试连接时,服务器还没准备好监听端口,自然会抛出java.net.ConnectException: Connection refused异常。

问题根源分析

看你的代码逻辑:

  1. 主方法里先调用了showClient(),这个方法内部直接执行了client.startServer()(注意这个方法名有误导性,它实际是客户端发起连接的逻辑)
  2. 客户端立刻尝试连接127.0.0.1:1201,但此时主方法里的ss=new ServerSocket(1201)还没执行,服务器根本没开始监听端口
  3. 而你单独运行时,应该是先启动了服务器端代码,再启动客户端,顺序是对的,所以能正常连接

具体解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:22:54