Java写一个简单的静态文件的HTTP服务器(基于Socket)
生活随笔
收集整理的這篇文章主要介紹了
Java写一个简单的静态文件的HTTP服务器(基于Socket)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
**
一、實現思路
**
-
1、使用 ServerSocket 監聽某一端口,然后等待連接獲取 Socket對象。
-
2、創建一個類 HttpServer 繼承 java.lang.Thread 類,重寫 run()方法,執行瀏覽器請求。
-
3、獲得瀏覽器請求,解析資源文件路徑。
-
4、讀取資源文件,響應給瀏覽器。
**
二、代碼實現
**
1、ServerSocket 監聽端口,獲取 Socket對象
package com.httpserver.two; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /*** @description: 使用socket 自己寫一個web服務器 ---監聽端口,獲取socket 對象。* @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類 — 具體作用看方法注釋
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 實現 web服務器 --- 具體執行讀寫操作的。<br>* fix: 1、換行符寫錯誤:"/r/n" 調整為正確: "\r\n"。 <br>* 2、"HTTP /1.1 200 ok" 中,"HTTP"和"/1.1" 直接不能有空格,否則 Firefox無法解析。<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:/";/*** 輸入流對象,讀取瀏覽器請求*/private InputStream input;/*** 輸出流對象,響應內容給瀏覽器*/private OutputStream out;/*** @description:初始化socket對象,獲取對應 輸入,輸出流* @param socket*/public HttpServerFix(Socket socket) {try {input = socket.getInputStream();out = socket.getOutputStream();} catch (IOException e) {e.printStackTrace();}}/*** 多線程方法調用*/@Overridepublic void run() {String filePath = read();response(filePath);}/*** @description: 讀取資源文件,響應給瀏覽器。* @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"寫錯了,正確的是: "\r\n"* 2、"HTTP /1.1 ..."之間不能有空格,否則Firfox不能解析* 3、 關于換行符的補充:* 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 解決中文亂碼問題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 {// 讀取請求頭, 如: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;}}**
三、代碼測試
**
1、啟動服務器
public static void main(String[] args) {new WebServer().startServer(8000); }2、瀏覽器地址欄輸入: http://localhost:8000/index.html
3、效果如下:
**
四、總結
**
-
1、該示例代碼可直接粘貼IDE中運行,無需任何第三方jar包。 簡單簡潔,便于理解。
-
2、c盤中,必須有一個 index.html的文件,若存放在其他位置,請修改 HttpServer.ROOT字段,路徑位置即可。
-
3、若出現請求成功,響應頁面為空白,請去掉 index.html 頁面的 標簽試試。— 至于什么問題導致的,目前還不清楚。 -_-!
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機制
//TODO總結
以上是生活随笔為你收集整理的Java写一个简单的静态文件的HTTP服务器(基于Socket)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息称 OPPO Reno11 系列手机
- 下一篇: 曝谷歌向三星支付80亿美元 买断三星手机