Java中客户端/服务器开发全解析
立即解锁
发布时间: 2025-08-19 00:15:57 阅读量: 1 订阅数: 5 

### Java 中客户端/服务器开发全解析
在当今的网络应用开发中,客户端/服务器架构是最为常见的模式之一。Java 作为一门强大的编程语言,提供了丰富的工具和类库来实现客户端和服务器的开发。本文将详细介绍如何使用 Java 构建简单的 HTTP 客户端和服务器,并深入探讨使用标准 Java 类进行客户端/服务器开发的方法。
#### 构建简单的 HTTP 服务器
我们将使用 `WebServer` 类来支持 HTTP/1.0 协议,该服务器仅处理 GET 请求,不过这足以展示服务器的基本元素,其他方法的支持也可以轻松添加。
以下是 `WebServer` 类的定义:
```java
public class WebServer {
public WebServer() {
System.out.println("Webserver Started");
try (ServerSocket serverSocket = new ServerSocket(80)) {
while (true) {
System.out.println("Waiting for client request");
Socket remote = serverSocket.accept();
System.out.println("Connection made");
new Thread(new ClientHandler(remote)).start();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String args[]) {
new WebServer();
}
}
```
需要注意的是,Mac 用户在使用端口 80 时可能会遇到错误,建议使用端口 3000 或 8080。
`ClientHandler` 类实现了 `Runnable` 接口,用于处理客户端请求:
```java
public class ClientHandler implements Runnable {
private final Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
System.out.println("\nClientHandler Started for " +
this.socket);
handleRequest(this.socket);
System.out.println("ClientHandler Terminated for "
+ this.socket + "\n");
}
}
```
`handleRequest` 方法用于与服务器进行通信,并处理客户端请求:
```java
public void handleRequest(Socket socket) {
try (BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));) {
String headerLine = in.readLine();
StringTokenizer tokenizer =
new StringTokenizer(headerLine);
String httpMethod = tokenizer.nextToken();
// 处理请求的代码
} catch (Exception e) {
e.printStackTrace();
}
}
```
接下来处理 GET 方法:
```java
if (httpMethod.equals("GET")) {
System.out.println("Get method processed");
String httpQueryString = tokenizer.nextToken();
StringBuilder responseBuffer = new StringBuilder();
responseBuffer
.append("<html><h1>WebServer Home Page.... </h1><br>")
.append("<b>Welcome to my web server!</b><BR>")
.append("</html>");
sendResponse(socket, 200, responseBuffer.toString());
} else {
System.out.println("The HTTP method is not recognized");
sendResponse(socket, 405, "Method Not Allowed");
}
```
`sendResponse` 方法用于发送响应:
```java
public void sendResponse(Socket socket,
int statusCode, String responseString) {
String statusLine;
String serverHeader = "Server: WebServer\r\n";
String contentTypeHeader = "Content-Type: text/html\r\n";
try (DataOutputStream out =
new DataOutputStream(socket.getOutputStream());) {
if (statusCode == 200) {
statusLine = "HTTP/1.0 200 OK" + "\r\n";
String contentLengthHeader = "Content-Length: "
+ responseString.length() + "\r\n";
out.writeBytes(statusLine);
out.writeBytes(serverHeader);
out.writeBytes(contentTypeHeader);
out.writeBytes(contentLengthHeader);
out.writeBytes("\r\n");
out.writeBytes(responseString);
} else if (statusCode == 405) {
statusLine = "HTTP/1.0 405 Method Not Allowed" + "\r\n";
out.writeBytes(statusLine);
out.writeBytes("\r\n");
} else {
statusLine = "HTTP/1.0 404 Not Found" + "\r\n";
out.writeBytes(statusLine);
out.writeBytes("\r\n");
}
out.close();
} catch (IOException ex) {
// 处理异常
}
}
```
以下是服务器处理请求的流程图:
```mermaid
graph TD;
A[服务器启动] --> B[等待客户端请求];
B --> C[接受客户端连接];
C --> D[创建新线程处理请求];
D --> E[读取请求头];
E --> F{判断请求方法};
F -- GET --> G[处理 GET 请求];
F -- 其他 --> H[返回 405 状态码];
G --> I[构建响应];
I --> J[发送响应];
H --> J;
J --> K[关闭连接];
K --> B;
```
#### 构建简单的 HTTP 客户端
我们使用 `HTTPClient` 类来访问 HTTP 服务器:
```java
public class HTTPClient {
public HTTPClient() {
System.out.println("HTTP Client Started");
try {
InetAddress serverInetAddress =
InetAddress.getByName("127.0.0.1");
Socket connection = new Socket(serverInetAddress, 80);
try (OutputStream out = connection.getOutputStream();
BufferedReader in =
new BufferedReader(new
InputStreamReader(
connection.getInputStream()))) {
sendGet(out);
System.out.println(getResponse(in));
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
new HTTPClient();
}
private void sendGet(OutputStream out) {
try {
out.write("GET /default\r\n".getBytes());
out.write("User-Agent: Mozilla/5.0\r\n".getBytes());
}
```
0
0
复制全文
相关推荐










