Java Client-Server 实现教程

介绍

在本教程中,我们将一步步教你如何实现一个基本的Java Client-Server应用程序。这个应用程序允许客户端和服务器之间进行通信和数据传输。我们将通过建立一个简单的聊天室来演示这个过程。在聊天室中,客户端可以向服务器发送消息,然后服务器将这些消息广播给所有连接的客户端。

整体流程

以下是实现Java Client-Server应用程序的整体流程:

flowchart LR
A(建立服务器端Socket) --> B(监听客户端连接)
B --> C(接收客户端消息)
C --> D(广播消息给所有客户端)
D --> C

步骤说明

步骤1: 建立服务器端Socket

第一步是在服务器端建立一个Socket,以便客户端可以连接到它。以下是实现此步骤的代码示例:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    private ServerSocket serverSocket;

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

        while (true) {
            Socket clientSocket = serverSocket.accept();
            System.out.println("Client connected: " + clientSocket.getInetAddress().getHostAddress());

            // TODO: 处理与客户端的通信
        }
    }

    public void stop() throws IOException {
        serverSocket.close();
    }

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

上述代码通过ServerSocket类创建了一个服务器端Socket,并在指定端口上开始监听客户端连接。一旦有客户端连接,服务器端将输出客户端的IP地址并进行下一步处理。

步骤2: 监听客户端连接

第二步是监听客户端连接。一旦有客户端连接,我们将执行一些操作。以下是实现此步骤的代码示例:

while (true) {
    Socket clientSocket = serverSocket.accept();
    System.out.println("Client connected: " + clientSocket.getInetAddress().getHostAddress());

    // TODO: 处理与客户端的通信
}

上述代码示例中的serverSocket.accept()方法将阻塞程序,直到有客户端连接到服务器端Socket。一旦客户端连接成功,我们可以获取客户端的Socket对象,并在控制台输出客户端的IP地址。

步骤3: 接收客户端消息

第三步是接收来自客户端的消息。我们将使用输入流从客户端Socket中读取数据。以下是实现此步骤的代码示例:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

// ...

Socket clientSocket = serverSocket.accept();
System.out.println("Client connected: " + clientSocket.getInetAddress().getHostAddress());

// 获取输入流
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String message;
while ((message = reader.readLine()) != null) {
    System.out.println("Received message from client: " + message);

    // TODO: 处理接收到的消息
}

上述代码示例中,我们创建了一个BufferedReader对象,并使用InputStreamReader从客户端Socket的输入流中读取数据。我们使用readLine()方法连续读取来自客户端的消息,直到读取到null为止。

步骤4: 广播消息给所有客户端

在这最后一步中,我们将广播来自客户端的消息给所有连接的客户端。我们将使用输出流将数据发送到客户端的Socket。以下是实现此步骤的代码示例:

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

// ...

private List<PrintWriter> clientWriters = new ArrayList<>();

// ...

while ((message = reader.readLine()) != null) {
    System.out.println("Received message from client: " + message);

    // 广播消息给所有客户端
    for (PrintWriter writer : clientWriters) {
        writer.println(message);
        writer.flush();
    }
}

上述代码示例中