日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java写一个简单的静态文件的HTTP服务器(基于Socket)

發(fā)布時(shí)間:2023/12/4 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java写一个简单的静态文件的HTTP服务器(基于Socket) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

**

一、實(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。