本文目录导读:

我来为您提供一个完整的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即时通讯系统实现,适合学习和二次开发。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播