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();
}
}
}