1. 项目结构
1.1 基本架构
本项目采用基于Java的`Swing`库进行图形界面开发,并使用`Socket`进行网络通信。项目包名为`org.example.tcp`。
1.2 模块划分
项目主要分为以下几个模块:
图形用户界面(GUI)模块
网络通信模块
线程处理模块
2. GUI设计
2.1 主窗口设计
2.1.1 创建主窗口
主窗口使用`JFrame`进行创建。需要设置窗口的标题、大小以及关闭操作。为了实现更灵活的布局管理,采用`BorderLayout`布局管理器。
frame = new JFrame("Socket Chat Client");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setLayout(new BorderLayout());
2.2 聊天记录显示区域
2.2.1 创建并设置`JTextArea`
聊天记录显示区域使用`JTextArea`进行实现,并设置为不可编辑以确保聊天记录的完整性。
2.2.2 添加滚动功能
为了支持滚动功能,将`JTextArea`放置在`JScrollPane`中,这样可以在聊天记录超出显示区域时进行滚动查看。
chatArea = new JTextArea();
chatArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(chatArea);
frame.add(scrollPane, BorderLayout.CENTER);
2.3 输入区域和发送按钮
2.3.1 创建输入框和按钮
使用`JTextField`创建消息输入框,使用`JButton`创建发送按钮。将这两个组件放置在一个`JPanel`中,并使用`BorderLayout`布局管理器进行布局。
inputField = new JTextField();
sendButton = new JButton("Send");
2.3.2 添加按钮点击事件
为发送按钮添加点击事件监听器,当用户点击按钮时,触发发送消息的操作。
sendButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendMessage();
}
});
2.3.3 布局输入区域
将输入框和按钮放置在`JPanel`中,并添加到主窗口的南部区域。
JPanel inputPanel = new JPanel();
inputPanel.setLayout(new BorderLayout());
inputPanel.add(inputField, BorderLayout.CENTER);
inputPanel.add(sendButton, BorderLayout.EAST);
frame.add(inputPanel, BorderLayout.SOUTH);
frame.setVisible(true);
3. 网络通信
3.1 连接服务器
3.1.1 创建`Socket`
使用指定的服务器地址和端口号,创建一个连接到服务器的`Socket`。
socket = new Socket(serverAddress, serverPort);
3.1.2 获取输入输出流
从服务器的`Socket`中获取输入流`BufferedReader`和输出流`PrintWriter`,以进行消息传递。
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
3.2 处理服务器消息
3.2.1 创建并启动消息接收线程
为了不阻塞主线程,需要创建并启动一个新的线程来处理接收服务器消息的任务。在该线程中,循环读取服务器发送的消息,并将其显示在聊天区域。
Thread receiveThread = new Thread(new Runnable() {
@Override
public void run() {
String message;
try {
while ((message = in.readLine()) != null) {
chatArea.append("Server: " + message + "\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
receiveThread.start();
3.3 发送消息
3.3.1 实现消息发送功能
在发送按钮的事件监听器中,获取输入框中的消息,使用输出流将消息发送到服务器,并在聊天区域显示发送的消息。
private void sendMessage() {
String message = inputField.getText();
out.println(message);
chatArea.append("客户端: " + message + "\n");
inputField.setText("");
}
3.3.2 清空输入框
在发送消息后,清空输入框以便用户输入下一条消息。
inputField.setText("");
4. 启动客户端
4.1 启动方法
4.1.1 主方法
在`main`方法中,创建`ClientGUI`实例并启动客户端,连接到本地的服务器端口。
public static void main(String[] args) {
ClientGUI client = new ClientGUI();
client.start("localhost", 6666); // 连接到本地的服务器端口
}
通过以上步骤,我们就能创建一个简单的Socket聊天客户端,具备图形用户界面,能够处理多次对话,并且可以发送和接收消息。服务器端程序的设计和实现与客户端类似,可以参照客户端的思路进行开发。
运行结果如下: