使用Socket编程实现简单的web服务功能,能够完成请求和响应
什么是Socket
socket编程是传输层供给应用层的编程接口,是应用层与传输层之间的桥梁,使用Socket编程可以开发客户机和服务器应用程序,可以在本地网络上进行通信,也可通过Internet在全球范围内通信。
Socket编程实现简单的web服务功能(底部有完整代码)
- 首先在main方法中创建一个serverSocket对象,绑定IP地址和端口号,并在服务启动之后在控制台打印输出服务启动的提示,记得抛出输入输出异常或用try-catch环绕
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务启动,8888端口监听中...");
- 然后进入一个无限循环,这里无限循环不是必要的,但是无限循环可以让服务器持续接受客户端的连接和处理请求,防止一次请求之后就关闭。
- 在循环中,服务器调用
ServerSocket
的accept
方法来等待客户端的连接。当有客户端连接时,accept
会返回一个新的Socket对象,代表与该客户端的连接。然后服务器调用handleRequest
方法来处理请求,handleRequest
的实现在下面会说
while(true) {
// 接收客户端连接
Socket clientSocket = serverSocket.accept();
System.out.println("客户端" + clientSocket.getInetAddress() + "连接成功");
// 处理客户端请求
handleRequest(clientSocket);
}
- 在
handleRequest
方法中,我们使用BufferedReader
和PrintWriter
来获取客户端的输入流和输出流。通过输入流我们可以读取客户端发送的请求报文;通过输出流,我们可以向客户端发送响应报文
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
// 读请求报文
String requestLine = in.readLine();
System.out.println("请求行:" + requestLine);
// 解析请求报文
String[] requestParts = requestLine.split(" ");
String requestMethod = requestParts[0];
String requestPath = requestParts[1];
// 构造响应报文
String responseBody = "<h1>Hello Servlet!</h1>";
String responseHeaders = "HTTP/1.1 200 OK\r\nContent-Length:" + responseBody.length() + "\r\nContent-Type:text/html\r\n\r\n";
String responseData = responseHeaders + responseBody;
- 最后关闭服务
out.close();
in.close();
clientSocket.close();
完整代码如下
import java.io.*;
import java.net.*;
public class SimpleWebServer {
public static void main(String[] args) {
// 创建ServeSocket对象,绑定IP地址和端口号
try {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务启动,8888端口监听中...");
while(true) {
// 接收客户端连接
Socket clientSocket = serverSocket.accept();
System.out.println("客户端" + clientSocket.getInetAddress() + "连接成功");
// 处理客户端请求
handleRequest(clientSocket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static void handleRequest(Socket clientSocket) {
// 获取输入流和输出流
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
// 读请求报文
String requestLine = in.readLine();
System.out.println("请求行:" + requestLine);
// 解析请求报文
String[] requestParts = requestLine.split(" ");
String requestMethod = requestParts[0];
String requestPath = requestParts[1];
// 构造响应报文
String responseBody = "<h1>Simple web Server</h1>";
String responseHeaders = "HTTP/1.1 200 OK\r\nContent-Length:" + responseBody.length() + "\r\nContent-Type:text/html\r\n\r\n";
String responseData = responseHeaders + responseBody;
// 发送响应报文给客户端
out.println(responseData);
// 关闭流和客户端连接
out.close();
in.close();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}