Java 實現(xiàn)簡單靜態(tài)資源Web服務(wù)器的示例
需求
有時候我們想快速通過http訪問本地的一些資源,但是安裝一些web服務(wù)器又很費時和浪費資源,而且也不是長期使用的。
這時候我們可以啟動一個小型的java服務(wù)器,快速實現(xiàn)一個http的靜態(tài)資源web服務(wù)器。
難點
其實沒什么難點,主要是注意請求頭和返回頭的處理。然后將請求的文件以流的方式讀入返回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ù)器啟動=====");
ResourceWebServer server = new ResourceWebServer();
server.startServer();
}
public void startServer() throws IOException {
ServerSocket serverSocket = new ServerSocket(SERVER_PORT, MAX_CONNECTION_LENGTH, InetAddress.getByName("localhost"));
log("======準備接收請求=====");
while (true) {
Socket socket = serverSocket.accept();
try (InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream()) {
String requestUri = getRequestUri(inputStream);
log("請求文件:" + requestUri);
writeHeaders(outputStream);
Path path = Paths.get(getClass().getClassLoader().getResource(requestUri.substring(1)).toURI());
Files.copy(path, outputStream);
} catch (Exception e) {
log("發(fā)生錯誤啦!");
e.printStackTrace();
}
}
}
private void writeHeaders(OutputStream outputStream) throws IOException {
//必須包含返回頭,否則瀏覽器不識別
outputStream.write("HTTP/1.1 200 OK\r\n".getBytes());
//一個\r\n代表換行添加新的頭,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();
//此時的uri還包含了請求頭等信息,需要去掉
//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);
}
}
接下來,就可以在resource文件下放入靜態(tài)資源啦,比如放一個index.html
然后啟動,打開瀏覽器輸入http://localhost:8888/index.html就能看到結(jié)果了!
以上就是Java 實現(xiàn)簡單靜態(tài)資源Web服務(wù)器的示例的詳細內(nèi)容,更多關(guān)于java 實現(xiàn)web服務(wù)器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java畢業(yè)設(shè)計實戰(zhàn)項目之寵物商城系統(tǒng)的實現(xiàn)流程
這是一個使用了java+Springboot+Maven+mybatis+Vue+mysql開發(fā)的寵物商城系統(tǒng),是一個畢業(yè)設(shè)計的實戰(zhàn)練習(xí),具有寵物商城該有的所有功能,感興趣的朋友快來看看吧2022-01-01
Java中JDom解析XML_動力節(jié)點Java學(xué)院整理
JDOM是一種解析XML的Java工具包。DOM適合于當今流行的各種語言,包括Java,JavaScripte,VB,VBScript,Perl,C,C++等。下面通過本文給大家介紹Java中JDom解析XML的方法,感興趣的朋友一起學(xué)習(xí)吧2017-07-07
eclipse+maven+spring mvc項目基本搭建過程
這篇文章主要介紹了eclipse+maven+spring mvc項目基本搭建過程,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09
深度剖析Java成員變量、局部變量和靜態(tài)變量的創(chuàng)建和回收時機
這篇文章主要介紹了深度剖析Java成員變量、局部變量和靜態(tài)變量的創(chuàng)建和回收時機,成員變量是定義在類中的變量,每個類的實例都會擁有自己的成員變量。它們的生命周期與對象的創(chuàng)建和銷毀相對應(yīng),下面我將詳細介紹它們的特點和生命周期,需要的朋友可以參考下2023-07-07
Spring Native實現(xiàn)0.059s啟動一個SpringBoot項目
Spring Native是Spring框架的一個子項目,旨在提供一種將Spring應(yīng)用程序編譯為本地可執(zhí)行文件的方法,從而提高啟動時間和資源效率,本文主要介紹了Spring Native實現(xiàn)0.059s啟動一個SpringBoot項目,感興趣的可以了解一下2024-02-02

