如何使用Java网络编程函数创建HTTP服务器
Java网络编程是一种非常重要的技能,无论是进行客户端与服务器通信,还是进行服务器端的编程开发,都需要使用网络编程技能来处理网络数据传输。本文将从创建HTTP服务器的角度,向大家介绍在Java网络编程中如何使用Socket, ServerSocket, BufferedReader, PrintWriter等函数创建HTTP服务器。
一、创建Socket服务器
为了创建HTTP服务器,我们首先需要创建Socket服务器。Socket服务器可以理解为监听客户端请求的网络端口,一旦有客户端请求,Socket服务器就会进行连接并接收数据进行处理。下面介绍如何创建一个简单的Socket服务器:
public static void main(String[] args){
ServerSocket serverSocket = null;
Socket socket = null;
BufferedReader reader = null;
PrintWriter writer = null;
try {
// 创建ServerSocket服务器
serverSocket = new ServerSocket(8080);
System.out.println("服务器已经启动....");
while (true) {
// 监听客户端请求
socket = serverSocket.accept();
// 获取客户端请求数据
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = null, request = "";
while ((line = reader.readLine()) != null) {
request += line;
}
System.out.println("客户端请求数据:" + request);
// 响应客户端请求
writer = new PrintWriter(socket.getOutputStream(), true);
writer.println("HTTP/1.1 200 OK");
writer.println("Content-Type: text/html; charset=utf-8");
writer.println(""); // 必须加一个空行
writer.println("Hello World.");
// 关闭资源
writer.close();
reader.close();
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (writer != null) writer.close();
if (reader != null) reader.close();
if (socket != null) socket.close();
if (serverSocket != null) serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上面的代码中,我们首先创建了一个ServerSocket对象,并将其绑定到8080端口,然后进入一个无限循环,不断监听客户端连接请求。每当有一个客户端连接请求时,就创建一个Socket对象,并获取其输入流和输出流,接收并响应客户端请求。
如果我们运行上述代码,它将一直阻塞等待客户端的连接请求。为了测试部署上述代码是否成功,我们需要先启动一个Web浏览器(比如Chrome、Firefox等),然后在地址栏中输入:“http://127.0.0.1:8080”即可,如果一切正常,我们将能看到浏览器返回的结果是:“Hello World.”。
二、创建HTTP服务器
上面我们创建了一个简单的Socket服务器,那么如何创建一个HTTP服务器呢?下面将介绍如何在上述代码基础上进行改进,使其成为能够处理HTTP协议的网页服务器:
public static void main(String[] args){
ServerSocket serverSocket = null;
Socket socket = null;
BufferedReader reader = null;
PrintWriter writer = null;
try {
// 创建ServerSocket服务器
serverSocket = new ServerSocket(8080);
System.out.println("服务器已经启动....");
while (true) {
// 监听客户端请求
socket = serverSocket.accept();
// 获取客户端请求数据
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = null, request = "";
while ((line = reader.readLine()) != null && !line.isEmpty()) {
request += line + "\r
"; // http请求头必须换行
}
System.out.println("客户端请求数据:" + request);
// 响应客户端请求
String response = "Hello World.";
writer = new PrintWriter(socket.getOutputStream(), true);
writer.println("HTTP/1.1 200 OK");
writer.println("Content-Type: text/plain; charset=utf-8");
writer.println("Content-Length: " + response.length());
writer.println(""); // 必须加一个空行分隔
writer.println(response);
// 关闭资源
writer.close();
reader.close();
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (writer != null) writer.close();
if (reader != null) reader.close();
if (socket != null) socket.close();
if (serverSocket != null) serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在HTTP协议中,我们需要遵循一定的规范来处理请求。首先是请求头,HTTP头部分可以被分为3个部分:
1. 请求行:包括请求方法、URI和协议版本,以空格分隔,结尾加上"\r
"换行符。
2. 请求头(可选):包括很多键值对,又叫请求参数。
3. 空行(必须):请求头和请求体之间必须有一个空行分隔。
以上是HTTP的请求格式。服务器需要响应格式要求如下:
1. 响应头:包括协议版本、状态码、状态描述和服务器类型信息,以空格和"\r
"分隔。
2. 响应头部其他信息(可选):用键值对的方式设置响应头部的其他信息。
3. 空行(必须):响应头和响应体之间必须有一个空行分隔。
3. 响应体:可以是HTML页面代码,图片等。
以上是HTTP协议的响应格式。在上述代码中,我们根据HTTP协议的格式规范修改了请求头和响应头,并且可以处理客户端请求,响应客户端请求。
总结:Java网络编程是一种非常重要的技能。在本文中,我们介绍了如何使用Socket, ServerSocket, BufferedReader, PrintWriter等函数创建HTTP服务器。通过本文的学习,相信你已经能够掌握如何使用Java进行网络编程,对于创建网络应用具备了更扎实的理论基础。
