Java实现带图形界面的聊天程序
本指南详解如何利用 Java Swing 组件搭建图形界面,并通过 TCP Socket 协议实现客户端与服务端之间的文字聊天。内容涵盖完整的服务器端与客户端代码结构、UI 布局配置及核心网络通信逻辑。
结果与目标
最终目标是运行两个独立的 Java 应用程序:一个作为 Server 监听特定端口,另一个作为 Client 连接该端口。双方在启动后可以通过各自的图形界面输入并实时接收对方发送的消息,形成双向通信。
准备条件
- 开发环境:已安装 JDK(建议使用 JDK 8 或更高版本)及任意集成开发环境(IDE 如 IntelliJ IDEA、Eclipse 或记事本)。
- 端口规划:服务器默认监听
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步:运行与测试
完成状态判断:
- 启动顺序:必须先运行
ServerDemo01类。此时服务器窗口出现,命令行无报错且处于等待状态。 - 建立连接:随后运行
ClientDemo01类。若成功连接,双方窗口的标题栏应正常显示(“服务器”与“客户端”),且不弹出异常提示。 - 通信测试:
Server端输入文字并点击“发送”,Client端应立即在文本区看到“服务器:[内容]”。反之亦然。
简要总结
通过上述步骤,我们利用 Java 内置的 javax.swing 包完成了简单的 GUI 设计,并使用 java.net.Socket 和 DataInputStream/OutputStream 实现了基于 TCP 的全双工文本传输。这套代码可作为进一步学习多线程网络编程或更复杂即时通讯应用的基础架构。
以上就是 Java 实现带图形界面聊天程序的详细内容,更多关于 Java Swing 网络编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













