Java 實(shí)現(xiàn)簡(jiǎn)單靜態(tài)資源Web服務(wù)器的示例
需求
有時(shí)候我們想快速通過(guò)http訪問(wèn)本地的一些資源,但是安裝一些web服務(wù)器又很費(fèi)時(shí)和浪費(fèi)資源,而且也不是長(zhǎng)期使用的。
這時(shí)候我們可以啟動(dòng)一個(gè)小型的java服務(wù)器,快速實(shí)現(xiàn)一個(gè)http的靜態(tài)資源web服務(wù)器。
難點(diǎn)
其實(shí)沒(méi)什么難點(diǎn),主要是注意請(qǐng)求頭和返回頭的處理。然后將請(qǐng)求的文件以流的方式讀入返回outputstream即可。
代碼
直接上代碼吧~
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class ResourceWebServer {
private static final int SERVER_PORT = 8888;
private static final int MAX_CONNECTION_LENGTH = 1;
public static void main(String[] args) throws IOException {
log("======服務(wù)器啟動(dòng)=====");
ResourceWebServer server = new ResourceWebServer();
server.startServer();
}
public void startServer() throws IOException {
ServerSocket serverSocket = new ServerSocket(SERVER_PORT, MAX_CONNECTION_LENGTH, InetAddress.getByName("localhost"));
log("======準(zhǔn)備接收請(qǐng)求=====");
while (true) {
Socket socket = serverSocket.accept();
try (InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream()) {
String requestUri = getRequestUri(inputStream);
log("請(qǐng)求文件:" + requestUri);
writeHeaders(outputStream);
Path path = Paths.get(getClass().getClassLoader().getResource(requestUri.substring(1)).toURI());
Files.copy(path, outputStream);
} catch (Exception e) {
log("發(fā)生錯(cuò)誤啦!");
e.printStackTrace();
}
}
}
private void writeHeaders(OutputStream outputStream) throws IOException {
//必須包含返回頭,否則瀏覽器不識(shí)別
outputStream.write("HTTP/1.1 200 OK\r\n".getBytes());
//一個(gè)\r\n代表?yè)Q行添加新的頭,2次\r\n代表頭結(jié)束
outputStream.write("Content-Type: text/html\r\n\r\n".getBytes());
}
private String getRequestUri(InputStream inputStream) throws IOException {
StringBuilder stringBuilder = new StringBuilder(2048);
byte[] buffer = new byte[2048];
int size = inputStream.read(buffer);
for (int i = 0; i < size; i++) {
stringBuilder.append((char) buffer[i]);
}
String requestUri = stringBuilder.toString();
//此時(shí)的uri還包含了請(qǐng)求頭等信息,需要去掉
//GET /index.html HTTP/1.1...
int index1, index2;
index1 = requestUri.indexOf(" ");
if (index1 != -1) {
index2 = requestUri.indexOf(" ", index1 + 1);
if (index2 > index1) {
return requestUri.substring(index1 + 1, index2);
}
}
return "";
}
private static void log(Object object) {
System.out.println(object);
}
}
接下來(lái),就可以在resource文件下放入靜態(tài)資源啦,比如放一個(gè)index.html
然后啟動(dòng),打開瀏覽器輸入http://localhost:8888/index.html就能看到結(jié)果了!
以上就是Java 實(shí)現(xiàn)簡(jiǎn)單靜態(tài)資源Web服務(wù)器的示例的詳細(xì)內(nèi)容,更多關(guān)于java 實(shí)現(xiàn)web服務(wù)器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Intellij IDEA 與maven 版本不符 Unable to import maven project See
這篇文章主要介紹了Intellij IDEA 與maven 版本不符 Unable to import maven project See logs for details: No implementation for org.apache.maven.model.path.PathTranslator was bound,本文通過(guò)圖文給大家分享解決方案,需要的朋友可以參考下2020-08-08
Java springboot 整合 Nacos的實(shí)例代碼
這篇文章主要介紹了Java springboot 整合 Nacos的實(shí)例,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
基于java實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于java實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
在SpringBoot微服務(wù)中設(shè)置和管理多個(gè)數(shù)據(jù)庫(kù)的代碼示例
在現(xiàn)代微服務(wù)架構(gòu)中,通常需要與多個(gè)數(shù)據(jù)庫(kù)交互的服務(wù),這可能是由于各種原因,例如遺留系統(tǒng)集成、不同類型的數(shù)據(jù)存儲(chǔ)需求,或者僅僅是為了優(yōu)化性能,在本綜合指南中,我們將探討如何在 Spring Boot 微服務(wù)中設(shè)置和管理多個(gè)數(shù)據(jù)庫(kù)連接,需要的朋友可以參考下2024-12-12
使用jpa之動(dòng)態(tài)插入與修改(重寫save)

