Java 连接多个客户端:实现多客户端通信

在现代软件开发中,Java 因其跨平台和高性能的特性,被广泛应用于网络编程。本文将介绍如何使用 Java 连接多个客户端,实现多客户端之间的通信。我们将通过一个简单的聊天室程序来展示这一过程。

概述

在多客户端通信中,服务器扮演着中心节点的角色,负责接收来自不同客户端的消息,并将其转发给其他所有客户端。客户端之间并不直接通信,而是通过服务器进行消息交换。

服务器端设计

服务器端主要负责监听客户端的连接请求,接收客户端发送的消息,并将其广播给所有已连接的客户端。

类图

以下是服务器端的类图:

classDiagram
    class Server {
        +ServerSocket serverSocket
        +List<ClientHandler> clients
        +void start()
        +void broadcast(String message)
    }
    class ClientHandler extends Thread {
        +Socket clientSocket
        +String clientName
        +void run()
    }

关系图

以下是服务器端与客户端的关系图:

erDiagram
    SERVER ||--o| CLIENT : "handles"
    CLIENT ||--o| CLIENTHANDLER : "implemented by"

服务器端代码示例

import java.io.*;
import java.net.*;
import java.util.*;

public class Server {
    private ServerSocket serverSocket;
    private List<ClientHandler> clients = new ArrayList<>();

    public void start() throws IOException {
        serverSocket = new ServerSocket(8000);
        System.out.println("Server started on port 8000");

        try {
            while (true) {
                Socket clientSocket = serverSocket.accept();
                System.out.println("New client connected: " + clientSocket.getInetAddress().getHostAddress());
                ClientHandler clientHandler = new ClientHandler(clientSocket);
                clientHandler.start();
                clients.add(clientHandler);
            }
        } finally {
            serverSocket.close();
        }
    }

    public void broadcast(String message) {
        for (ClientHandler client : clients) {
            try {
                client.send(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Server server = new Server();
        try {
            server.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class ClientHandler extends Thread {
    private Socket clientSocket;
    private PrintWriter out;
    private BufferedReader in;

    public ClientHandler(Socket socket) throws IOException {
        this.clientSocket = socket;
        this.out = new PrintWriter(clientSocket.getOutputStream(), true);
        this.in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    }

    public void send(String message) throws IOException {
        out.println(message);
    }

    public void run() {
        try {
            String clientName = in.readLine();
            System.out.println("Client " + clientName + " joined the chat");

            Server server = (Server) this.getThreadGroup().getParent();
            server.broadcast(clientName + " joined the chat");

            String message;
            while ((message = in.readLine()) != null) {
                server.broadcast(clientName + ": " + message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端设计

客户端主要负责与服务器建立连接,发送消息给服务器,并接收来自服务器的消息。

客户端代码示例

import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 8000);
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("Enter your name:");
            String clientName = stdIn.readLine();
            out.println(clientName);

            System.out.println("Welcome to the chat room, " + clientName);

            String serverMessage;
            while ((serverMessage = in.readLine()) != null) {
                System.out.println(serverMessage);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

结语

通过本文的介绍,我们了解了如何使用 Java 实现多客户端通信。服务器端负责接收客户端的连接请求,接收消息并广播给所有客户端。客户端负责与服务器建立连接,发送消息给服务器,并接收来自服务器的消息。这种模式在实际应用中非常广泛,如在线聊天室、多人在线游戏等。希望本文能够帮助读者更好地理解多客户端通信的原理和实现方式。