Java实现带图形界面的聊天程序

Jasper
Jasper
发布时间:2026-10-16| 6人浏览过
原创

本指南详解如何利用 Java Swing 组件搭建图形界面,并通过 TCP Socket 协议实现客户端与服务端之间的文字聊天。内容涵盖完整的服务器端与客户端代码结构、UI 布局配置及核心网络通信逻辑。

结果与目标

最终目标是运行两个独立的 Java 应用程序:一个作为 Server 监听特定端口,另一个作为 Client 连接该端口。双方在启动后可以通过各自的图形界面输入并实时接收对方发送的消息,形成双向通信。

准备条件

  1. 开发环境:已安装 JDK(建议使用 JDK 8 或更高版本)及任意集成开发环境(IDE 如 IntelliJ IDEA、Eclipse 或记事本)。
  2. 端口规划:服务器默认监听 9999 端口。请确保该端口未被其他进程占用。

真实操作顺序

第1步:创建并配置服务器端(ServerDemo01.java)

目的:初始化服务器窗口,绑定 9999 端口并等待客户端连接,同时建立用于收发数据的输入输出流。

入口:新建文件 ServerDemo01.java。

动作:复制以下代码。该代码首先实例化 JFrame 窗口,布局包含消息显示区(JTextArea)、文本输入框(JTextField)和发送按钮(JButton)。在构造函数中,它尝试创建 ServerSocket 并在 accept() 处阻塞,直到有客户端接入。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerDemo01 implements ActionListener {
    private ServerSocket serverSocket;
    private Socket socket;
    private DataInputStream dataInputStream;
    private DataOutputStream dataOutputStream;
    private JFrame jFrame;
    private JScrollPane jScrollPane;
    private JTextArea jTextArea;
    private JPanel jPanel;
    private JTextField jTextField;
    private JButton jButton;

    public ServerDemo01() {
        // UI 初始化
        jFrame = new JFrame("服务器");
        jTextArea = new JTextArea();
        jScrollPane = new JScrollPane(jTextArea);
        jPanel = new JPanel();
        jTextField = new JTextField(20);
        jButton = new JButton("发送");

        jFrame.add(jScrollPane, BorderLayout.CENTER);
        jFrame.add(jPanel, BorderLayout.SOUTH);
        jPanel.add(jTextField);
        jPanel.add(jButton);

        jFrame.setBounds(200, 200, 400, 300);
        jFrame.setVisible(true);
        jFrame.setResizable(false);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jButton.addActionListener(this);

        // 网络通信初始化
        try {
            serverSocket = new ServerSocket(9999);
            socket = serverSocket.accept(); // 阻塞等待客户端连接
            dataInputStream = new DataInputStream(socket.getInputStream());
            dataOutputStream = new DataOutputStream(socket.getOutputStream());

            // 接收循环
            while (true) {
                String strClient = dataInputStream.readUTF();
                jTextArea.append("客户端:" + strClient + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == jButton) {
            String str = jTextField.getText();
            if (str.length() == 0) {
                JOptionPane.showMessageDialog(jTextField, "发送内容不能为空");
            } else {
                try {
                    dataOutputStream.writeUTF(str);
                    jTextArea.append("服务器:" + str + "\n");
                    jTextField.setText("");
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        new ServerDemo01();
    }
}

第2步:创建并配置客户端(ClientDemo01.java)

目的:连接到本地(127.0.0.1)的 9999 端口,获取对应的数据流,实现与服务器相同的双向消息发送与接收功能。

入口:新建文件 ClientDemo01.java。

动作:复制以下代码。客户端的主要区别在于初始化时直接使用 new Socket("127.0.0.1", 9999) 发起连接,而非被动监听。同样包含接收服务器的消息循环。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class ClientDemo01 implements ActionListener {
    private Socket socket;
    private DataInputStream dataInputStream;
    private DataOutputStream dataOutputStream;
    private JFrame jFrame;
    private JScrollPane jScrollPane;
    private JTextArea jTextArea;
    private JPanel jPanel;
    private JTextField jTextField;
    private JButton jButton;

    public ClientDemo01() {
        // UI 初始化
        jFrame = new JFrame("客户端");
        jTextArea = new JTextArea();
        jScrollPane = new JScrollPane(jTextArea);
        jPanel = new JPanel();
        jTextField = new JTextField(20);
        jButton = new JButton("发送");

        jFrame.add(jScrollPane, BorderLayout.CENTER);
        jFrame.add(jPanel, BorderLayout.SOUTH);
        jPanel.add(jTextField);
        jPanel.add(jButton);

        jFrame.setBounds(610, 200, 400, 300);
        jFrame.setVisible(true);
        jFrame.setResizable(false);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jButton.addActionListener(this);

        // 网络通信初始化
        try {
            socket = new Socket("127.0.0.1", 9999);
            dataInputStream = new DataInputStream(socket.getInputStream());
            dataOutputStream = new DataOutputStream(socket.getOutputStream());

            // 接收循环
            while (true) {
                String strServer = dataInputStream.readUTF();
                jTextArea.append("服务器:" + strServer + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == jButton) {
            String str = jTextField.getText();
            if (str.length() == 0) {
                JOptionPane.showMessageDialog(jTextField, "发送内容不能为空");
            } else {
                try {
                    dataOutputStream.writeUTF(str);
                    jTextArea.append("客户端:" + str + "\n");
                    jTextField.setText("");
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        new ClientDemo01();
    }
}

第3步:运行与测试

完成状态判断:

  1. 启动顺序:必须先运行 ServerDemo01 类。此时服务器窗口出现,命令行无报错且处于等待状态。
  2. 建立连接:随后运行 ClientDemo01 类。若成功连接,双方窗口的标题栏应正常显示(“服务器”与“客户端”),且不弹出异常提示。
  3. 通信测试:Server 端输入文字并点击“发送”,Client 端应立即在文本区看到“服务器:[内容]”。反之亦然。

简要总结

通过上述步骤,我们利用 Java 内置的 javax.swing 包完成了简单的 GUI 设计,并使用 java.net.Socket 和 DataInputStream/OutputStream 实现了基于 TCP 的全双工文本传输。这套代码可作为进一步学习多线程网络编程或更复杂即时通讯应用的基础架构。

以上就是 Java 实现带图形界面聊天程序的详细内容,更多关于 Java Swing 网络编程的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。