Java实现即时通讯案例

wen java案例 3

本文目录导读:

Java实现即时通讯案例

  1. 项目结构
  2. 服务端实现
  3. 客户端实现
  4. 使用说明
  5. 功能特性
  6. 扩展建议

我来为您提供一个完整的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

功能特性

  1. 用户管理: 注册、登录、在线状态显示
  2. 消息通信: 群聊、私聊、系统消息
  3. 图形界面: 友好的Swing界面
  4. 多线程: 支持多客户端并发连接
  5. 实时在线: 实时显示在线用户列表

扩展建议

可添加的功能:

  • 文件传输
  • 消息历史记录
  • 表情支持
  • 语音/视频通话
  • 数据库存储用户信息
  • 心跳检测机制
  • SSL加密通信

这个案例提供了一个完整的Java即时通讯系统实现,适合学习和二次开发。

上一篇Netty IM案例

下一篇GoEasy案例

抱歉,评论功能暂时关闭!