本文目录导读:

我来为您提供一个完整的Java即时通讯案例,包含服务端和客户端实现。
项目结构
im-system/
├── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/im/
│ │ │ ├── server/
│ │ │ │ ├── ChatServer.java
│ │ │ │ ├── ClientHandler.java
│ │ │ │ └── Message.java
│ │ │ └── client/
│ │ │ ├── ChatClient.java
│ │ │ └── ClientGUI.java
│ │ └── resources/
│ └── test/
服务端实现
ChatServer.java - 服务端主类
package com.im.server;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ChatServer {
private static final int PORT = 8888;
private ServerSocket serverSocket;
private ExecutorService executorService;
private ConcurrentHashMap<String, ClientHandler> onlineUsers;
public ChatServer() {
this.executorService = Executors.newCachedThreadPool();
this.onlineUsers = new ConcurrentHashMap<>();
}
public void start() {
try {
serverSocket = new ServerSocket(PORT);
System.out.println("服务器启动,监听端口: " + PORT);
while (true) {
Socket socket = serverSocket.accept();
System.out.println("客户端连接: " + socket.getRemoteSocketAddress());
ClientHandler handler = new ClientHandler(socket, this);
executorService.execute(handler);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void addUser(String username, ClientHandler handler) {
onlineUsers.put(username, handler);
broadcastMessage("系统", username + " 上线了!");
broadcastOnlineUsers();
}
public void removeUser(String username) {
onlineUsers.remove(username);
broadcastMessage("系统", username + " 下线了!");
broadcastOnlineUsers();
}
public void broadcastMessage(String sender, String message) {
for (ClientHandler handler : onlineUsers.values()) {
if (!handler.getUsername().equals(sender)) {
handler.sendMessage(sender, message);
}
}
}
public void sendPrivateMessage(String target, String sender, String message) {
ClientHandler handler = onlineUsers.get(target);
if (handler != null) {
handler.sendMessage(sender, "[私聊] " + message);
}
}
public void broadcastOnlineUsers() {
StringBuilder users = new StringBuilder("当前在线用户: ");
for (String username : onlineUsers.keySet()) {
users.append(username).append(" ");
}
for (ClientHandler handler : onlineUsers.values()) {
handler.sendMessage("系统", users.toString());
}
}
public static void main(String[] args) {
ChatServer server = new ChatServer();
server.start();
}
}
ClientHandler.java - 客户端处理线程
package com.im.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ClientHandler implements Runnable {
private Socket socket;
private ChatServer server;
private BufferedReader in;
private PrintWriter out;
private String username;
public ClientHandler(Socket socket, ChatServer server) {
this.socket = socket;
this.server = server;
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
// 接收用户名
username = in.readLine();
server.addUser(username, this);
String message;
while ((message = in.readLine()) != null) {
handleMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
closeConnection();
}
}
private void handleMessage(String message) {
if (message.startsWith("//")) {
// 私聊消息
String[] parts = message.substring(2).split(":", 3);
if (parts.length >= 3) {
server.sendPrivateMessage(parts[0], username, parts[2]);
}
} else {
// 广播消息
server.broadcastMessage(username, message);
}
}
public void sendMessage(String sender, String message) {
out.println(sender + ": " + message);
}
public String getUsername() {
return username;
}
private void closeConnection() {
try {
if (username != null) {
server.removeUser(username);
}
if (in != null) in.close();
if (out != null) out.close();
if (socket != null) socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端实现
ChatClient.java - 客户端业务逻辑
package com.im.client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class ChatClient {
private Socket socket;
private BufferedReader in;
private PrintWriter out;
private String username;
private ClientGUI gui;
public ChatClient(ClientGUI gui) {
this.gui = gui;
}
public boolean connect(String host, int port, String username) {
try {
this.username = username;
socket = new Socket(host, port);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(), true);
// 发送用户名
out.println(username);
// 启动消息接收线程
new Thread(this::readMessages).start();
gui.appendMessage("系统", "连接成功,开始聊天吧!");
return true;
} catch (IOException e) {
gui.appendMessage("系统", "连接失败: " + e.getMessage());
return false;
}
}
private void readMessages() {
try {
String message;
while ((message = in.readLine()) != null) {
processMessage(message);
}
} catch (IOException e) {
gui.appendMessage("系统", "连接已断开");
}
}
private void processMessage(String message) {
// 解析消息格式: sender: content
int colonIndex = message.indexOf(":");
if (colonIndex > 0) {
String sender = message.substring(0, colonIndex);
String content = message.substring(colonIndex + 1).trim();
gui.appendMessage(sender, content);
} else {
gui.appendMessage("系统", message);
}
}
public void sendMessage(String message) {
if (out != null && !message.isEmpty()) {
out.println(message);
}
}
public void disconnect() {
try {
if (out != null) out.close();
if (in != null) in.close();
if (socket != null) socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ClientGUI.java - 客户端图形界面
package com.im.client;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class ClientGUI extends JFrame {
private JTextArea messageArea;
private JTextField inputField;
private JButton sendButton;
private JButton connectButton;
private JTextField usernameField;
private JTextField hostField;
private ChatClient chatClient;
public ClientGUI() {
initializeUI();
chatClient = new ChatClient(this);
}
private void initializeUI() {
setTitle("Java 即时通讯客户端");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
// 顶部连接面板
JPanel connectPanel = new JPanel(new FlowLayout());
connectPanel.add(new JLabel("服务器:"));
hostField = new JTextField("localhost", 10);
connectPanel.add(hostField);
connectPanel.add(new JLabel("用户名:"));
usernameField = new JTextField(10);
connectPanel.add(usernameField);
connectButton = new JButton("连接");
connectButton.addActionListener(e -> connectToServer());
connectPanel.add(connectButton);
add(connectPanel, BorderLayout.NORTH);
// 中部消息面板
messageArea = new JTextArea(20, 50);
messageArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(messageArea);
add(scrollPane, BorderLayout.CENTER);
// 底部输入面板
JPanel inputPanel = new JPanel(new BorderLayout());
inputField = new JTextField();
sendButton = new JButton("发送");
inputPanel.add(inputField, BorderLayout.CENTER);
inputPanel.add(sendButton, BorderLayout.EAST);
add(inputPanel, BorderLayout.SOUTH);
// 事件监听
sendButton.addActionListener(e -> sendMessage());
inputField.addActionListener(e -> sendMessage());
// 窗口关闭处理
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
if (chatClient != null) {
chatClient.disconnect();
}
}
});
pack();
setLocationRelativeTo(null);
setVisible(true);
}
private void connectToServer() {
String host = hostField.getText().trim();
String username = usernameField.getText().trim();
if (username.isEmpty()) {
JOptionPane.showMessageDialog(this, "请输入用户名!");
return;
}
if (chatClient.connect(host, 8888, username)) {
connectButton.setEnabled(false);
usernameField.setEnabled(false);
hostField.setEnabled(false);
}
}
private void sendMessage() {
String message = inputField.getText().trim();
if (!message.isEmpty()) {
chatClient.sendMessage(message);
inputField.setText("");
}
}
public void appendMessage(String sender, String content) {
SwingUtilities.invokeLater(() -> {
messageArea.append("[" + sender + "] " + content + "\n");
messageArea.setCaretPosition(messageArea.getDocument().getLength());
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(ClientGUI::new);
}
}
使用说明
启动服务端
java -cp src com.im.server.ChatServer
启动客户端
java -cp src com.im.client.ClientGUI
功能特性
- 用户管理: 注册、登录、在线状态显示
- 消息通信: 群聊、私聊、系统消息
- 图形界面: 友好的Swing界面
- 多线程: 支持多客户端并发连接
- 实时在线: 实时显示在线用户列表
扩展建议
可添加的功能:
- 文件传输
- 消息历史记录
- 表情支持
- 语音/视频通话
- 数据库存储用户信息
- 心跳检测机制
- SSL加密通信
这个案例提供了一个完整的Java即时通讯系统实现,适合学习和二次开发。