Android Socket 一对多实现教程

1. 整体流程

下面是实现 Android Socket 一对多的整体流程图:

flowchart TD
    A[创建 ServerSocket] --> B[监听客户端连接]
    B --> C[为每个连接创建 Socket]
    C --> D[开启新线程处理每个 Socket]
    D --> E[读取客户端消息]
    E --> F[发送消息给所有客户端]
    F --> G[关闭连接]

2. 步骤详解

2.1 创建 ServerSocket

首先,我们需要创建一个 ServerSocket 对象用于监听客户端连接:

ServerSocket serverSocket = new ServerSocket(PORT);

其中,PORT 是你指定的服务器端口号。

2.2 监听客户端连接

接下来,我们需要在一个循环中监听客户端的连接请求:

while (true) {
    Socket socket = serverSocket.accept();
    // 处理客户端连接
}

accept() 方法会阻塞当前线程,直到有客户端连接上来。

2.3 为每个连接创建 Socket

在客户端连接成功后,我们需要为每个连接创建一个 Socket 对象,并将其保存起来:

Socket socket = serverSocket.accept();
clients.add(socket);

其中,clients 是一个保存所有客户端 Socket 的列表。

2.4 开启新线程处理每个 Socket

为了能够同时处理多个客户端的请求,我们需要开启新线程来处理每个 Socket 连接:

new Thread(() -> {
    // 处理客户端消息
}).start();

2.5 读取客户端消息

在新线程中,我们可以通过输入流来读取客户端发送的消息:

InputStream inputStream = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String message = reader.readLine();

2.6 发送消息给所有客户端

在收到客户端的消息后,我们可以遍历所有客户端 Socket,并将消息发送给每个客户端:

OutputStream outputStream;
for (Socket client : clients) {
    outputStream = client.getOutputStream();
    PrintWriter writer = new PrintWriter(outputStream);
    writer.println(message);
    writer.flush();
}

2.7 关闭连接

当某个客户端断开连接时,我们需要关闭相应的 Socket,并从列表中移除:

socket.close();
clients.remove(socket);

3. 示例代码

下面是一个简单的示例代码,演示了如何实现 Android Socket 一对多:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class SocketServer {
    private static final int PORT = 8080;
    private static List<Socket> clients = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(PORT);

        while (true) {
            Socket socket = serverSocket.accept();
            clients.add(socket);

            new Thread(() -> {
                try {
                    InputStream inputStream = socket.getInputStream();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                    String message = reader.readLine();

                    OutputStream outputStream;
                    for (Socket client : clients) {
                        outputStream = client.getOutputStream();
                        PrintWriter writer = new PrintWriter(outputStream);
                        writer.println(message);
                        writer.flush();
                    }

                    socket.close();
                    clients.remove(socket);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}