实现一个简单的静态资源Web服务器,可以基于Java语言编写。本文将提供一个完整的攻略,方便初学者快速上手。
1 创建项目
首先需要创建一个Java项目,可以使用Eclipse或者其他IDE。创建项目后,需要创建如下的目录结构:
src
├── main
│ └── java
│ └── com
│ └── example
│ └── webserver
│ ├── HttpServer.java
│ └── ResourceLoader.java
└── test
└── java
└── com
└── example
└── webserver
├── HttpServerTest.java
└── ResourceLoaderTest.java
其中,src/main/java/com/example/webserver
目录下是自己定义的代码,src/test/java/com/example/webserver
目录下是测试代码。
2 实现HttpServer
在com.example.webserver
包下创建HttpServer
类,用于启动HTTP服务器。具体实现步骤如下:
- 导入必要的包,如
java.net.*
,java.io.*
等。
package com.example.webserver;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
- 创建
HttpServer
类,主要包括以下函数:
public class HttpServer {
private int port; // 端口号
private ServerSocket serverSocket; // 服务器套接字
public HttpServer(int port) {
this.port = port;
}
// 启动服务器
public void start() throws Exception {
try {
serverSocket = new ServerSocket(port);
while (true) {
Socket socket = serverSocket.accept(); // 监听客户端
handleRequest(socket);
}
} catch (Exception e) {
throw new Exception("Could not start server" + e);
}
}
// 处理请求
private void handleRequest(Socket socket) throws Exception {
try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); OutputStream out = socket.getOutputStream()) {
String path = in.readLine().split(" ")[1];
byte[] contents;
if ("/".equals(path)) {
path = "index.html";
}
try {
Path filePath = Paths.get("public", path);
contents = Files.readAllBytes(filePath);
out.write(generateHeader(200, contents.length, getMimeType(filePath)).getBytes());
} catch (Exception e) {
contents = "404 Not Found".getBytes();
out.write(generateHeader(404, contents.length, "text/plain").getBytes());
}
out.write(contents);
} catch (Exception e) {
System.err.println("Error handling connection: " + e);
} finally {
socket.close(); // 关闭客户端
}
}
// 生成HTTP头部
private String generateHeader(int statusCode, int contentLength, String mimeType) {
String CRLF = "\r\n";
return String.format("HTTP/1.1 %d OK%s" + "Content-Length: %d%s" + "Content-Type: %s%s%s", statusCode, CRLF, contentLength, CRLF, mimeType, CRLF, CRLF);
}
// 获取MIME类型
private String getMimeType(Path filePath) throws Exception {
String type = Files.probeContentType(filePath);
if (type == null) {
return "application/octet-stream";
}
return type;
}
}
以上代码中,主要包括以下几个函数:
HttpServer(int port)
:构造函数,初始化端口号。start()
:启动HTTP服务器。handleRequest(Socket socket)
:处理请求,包括解析HTTP请求头、获取请求文件路径、读取文件内容、生成HTTP响应头和发送响应等步骤。generateHeader(int statusCode, int contentLength, String mimeType)
:生成HTTP响应头。getMimeType(Path filePath)
:获取文件的MIME类型。
需要注意的是,这里只是一个简单的实现,对于比较复杂的HTTP请求并没有实现。
3 实现ResourceLoader
在com.example.webserver
包下创建ResourceLoader
类,用于加载资源文件。具体实现步骤如下:
- 导入必要的包,如
java.net.*
,java.io.*
等。
package com.example.webserver;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
- 创建
ResourceLoader
类,主要包括以下函数:
public class ResourceLoader {
// 加载资源文件
public static byte[] load(String path) throws Exception {
Path filePath = Paths.get("public", path);
return Files.readAllBytes(filePath);
}
}
以上代码中,load(String path)
函数用于加载指定路径下的文件,并返回文件的字节数组,如果文件不存在则抛出异常。
4 实现示例
下面给出两个示例,分别是加载图片和HTML文件。
在public
目录下放置一个图片文件example.jpg
和一个HTML文件index.html
(可以使用随便找到的图片和HTML文件),创建如下主函数:
package com.example.webserver;
public class App {
public static void main(String[] args) throws Exception {
HttpServer server = new HttpServer(8080);
server.start();
}
}
然后运行该程序即可启动HTTP服务器。在浏览器中访问http://localhost:8080/example.jpg
即可查看图片,访问http://localhost:8080/
即可查看HTML文件。
这里再给出一个示例,通过ResourceLoader
直接加载HTML文件。修改handleRequest
函数如下:
private void handleRequest(Socket socket) throws Exception {
try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); OutputStream out = socket.getOutputStream()) {
String path = in.readLine().split(" ")[1];
byte[] contents;
if ("/".equals(path)) {
contents = ResourceLoader.load("index.html");
out.write(generateHeader(200, contents.length, "text/html").getBytes());
} else {
try {
Path filePath = Paths.get("public", path);
contents = Files.readAllBytes(filePath);
out.write(generateHeader(200, contents.length, getMimeType(filePath)).getBytes());
} catch (Exception e) {
contents = "404 Not Found".getBytes();
out.write(generateHeader(404, contents.length, "text/plain").getBytes());
}
}
out.write(contents);
} catch (Exception e) {
System.err.println("Error handling connection: " + e);
} finally {
socket.close(); // 关闭客户端
}
}
这个示例中,如果请求的是根目录,就直接通过ResourceLoader
加载index.html
文件,并返回HTML内容。否则就按照原来的方式处理请求。
至此,一个简单的静态资源Web服务器就完成了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 实现简单静态资源Web服务器的示例 - Python技术站