Java写一个简单的静态文件的HTTP服务器(基于Socket)
**
一、實(shí)現(xiàn)思路
**
-
1、使用 ServerSocket 監(jiān)聽(tīng)某一端口,然后等待連接獲取 Socket對(duì)象。
-
2、創(chuàng)建一個(gè)類(lèi) HttpServer 繼承 java.lang.Thread 類(lèi),重寫(xiě) run()方法,執(zhí)行瀏覽器請(qǐng)求。
-
3、獲得瀏覽器請(qǐng)求,解析資源文件路徑。
-
4、讀取資源文件,響應(yīng)給瀏覽器。
**
二、代碼實(shí)現(xiàn)
**
1、ServerSocket 監(jiān)聽(tīng)端口,獲取 Socket對(duì)象
package com.httpserver.two; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /*** @description: 使用socket 自己寫(xiě)一個(gè)web服務(wù)器 ---監(jiān)聽(tīng)端口,獲取socket 對(duì)象。* @version:v1.0* @author:w* @date:2018年6月6日上午11:03:36**/ public class WebServer {public void startServer(int port){try {@SuppressWarnings("resource")ServerSocket serverSocket = new ServerSocket(port);while(true){Socket socket = serverSocket.accept();new HttpServer(socket).start();}} catch (IOException e) {e.printStackTrace();}} }2、HttpServer.java類(lèi) — 具體作用看方法注釋
package com.httpserver.two.fix; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; /*** @description: 使用socket 實(shí)現(xiàn) web服務(wù)器 --- 具體執(zhí)行讀寫(xiě)操作的。<br>* fix: 1、換行符寫(xiě)錯(cuò)誤:"/r/n" 調(diào)整為正確: "\r\n"。 <br>* 2、"HTTP /1.1 200 ok" 中,"HTTP"和"/1.1" 直接不能有空格,否則 Firefox無(wú)法解析。<br>* @version:v1.1* @author:w* @date:2018年12月18日 16:50:28*/ public class HttpServerFix extends Thread {/*** web資源根路徑*/public static final String ROOT = "c:/";/*** 輸入流對(duì)象,讀取瀏覽器請(qǐng)求*/private InputStream input;/*** 輸出流對(duì)象,響應(yīng)內(nèi)容給瀏覽器*/private OutputStream out;/*** @description:初始化socket對(duì)象,獲取對(duì)應(yīng) 輸入,輸出流* @param socket*/public HttpServerFix(Socket socket) {try {input = socket.getInputStream();out = socket.getOutputStream();} catch (IOException e) {e.printStackTrace();}}/*** 多線程方法調(diào)用*/@Overridepublic void run() {String filePath = read();response(filePath);}/*** @description: 讀取資源文件,響應(yīng)給瀏覽器。* @param:@param filePath* 資源文件路徑* @return:void* @version:v1.0* @author:w* @date:2018年6月6日 上午11:42:37**/private void response(String filePath) {File file = new File(ROOT + filePath);if (file.exists()) {// 1、資源存在,讀取資源try {BufferedReader reader = new BufferedReader(new FileReader(file));StringBuffer sb = new StringBuffer();String line = null;while ((line = reader.readLine()) != null) {System.out.println("line:"+ line);sb.append(line).append("\r\n");}StringBuffer result = new StringBuffer();/*** 1、 換行符"/r/n"寫(xiě)錯(cuò)了,正確的是: "\r\n"* 2、"HTTP /1.1 ..."之間不能有空格,否則Firfox不能解析* 3、 關(guān)于換行符的補(bǔ)充:* a.windows:"\r\n"* b.linux:"\n"* c.mac:"\r" */// result.append("HTTP /1.1 200 ok /r/n");result.append("HTTP/1.1 200 ok \r\n");result.append("Content-Language:zh-CN \r\n");// charset=UTF-8 解決中文亂碼問(wèn)題result.append("Content-Type:text/html;charset=UTF-8 \r\n");result.append("Content-Length:" + file.length() + "\r\n");result.append("\r\n" + sb.toString());out.write(result.toString().getBytes());out.flush();out.close();} catch (Exception e) {e.printStackTrace();}} else {// 2、資源不存在,提示 file not foundStringBuffer error = new StringBuffer();error.append("HTTP/1.1 400 file not found \r\n");error.append("Content-Type:text/html \r\n");error.append("Content-Length:20 \r\n").append("\r\n");error.append("<h1 >File Not Found..</h1>");try {out.write(error.toString().getBytes());out.flush();out.close();} catch (IOException e) {e.printStackTrace();}}}/*** * @description:解析資源文件路徑* @example: GET /index.html HTTP/1.1* @param:@return* @return:String* @version:v1.0* @author:w* @date:2018年6月6日 上午11:39:42**/private String read() {BufferedReader reader = new BufferedReader(new InputStreamReader(input));try {// 讀取請(qǐng)求頭, 如:GET /index.html HTTP/1.1String readLine = reader.readLine();String[] split = readLine.split(" ");if (split.length != 3) {return null;}System.out.println(readLine);return split[1];} catch (IOException e) {e.printStackTrace();}return null;}}**
三、代碼測(cè)試
**
1、啟動(dòng)服務(wù)器
public static void main(String[] args) {new WebServer().startServer(8000); }2、瀏覽器地址欄輸入: http://localhost:8000/index.html
3、效果如下:
**
四、總結(jié)
**
-
1、該示例代碼可直接粘貼IDE中運(yùn)行,無(wú)需任何第三方j(luò)ar包。 簡(jiǎn)單簡(jiǎn)潔,便于理解。
-
2、c盤(pán)中,必須有一個(gè) index.html的文件,若存放在其他位置,請(qǐng)修改 HttpServer.ROOT字段,路徑位置即可。
-
3、若出現(xiàn)請(qǐng)求成功,響應(yīng)頁(yè)面為空白,請(qǐng)去掉 index.html 頁(yè)面的 標(biāo)簽試試。— 至于什么問(wèn)題導(dǎo)致的,目前還不清楚。 -_-!
4、 index.html 代碼參考
<!DOCTYPE html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body><h1>Hello World! this is my webserver!</h1> </body>五、拓展:加上cookie、session機(jī)制
//TODO總結(jié)
以上是生活随笔為你收集整理的Java写一个简单的静态文件的HTTP服务器(基于Socket)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 消息称 OPPO Reno11 系列手机
- 下一篇: 曝谷歌向三星支付80亿美元 买断三星手机