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();
}
}
上述代码示例中