java Socket實現(xiàn)簡單模擬HTTP服務器
最近復習計算機網(wǎng)絡,復習完應用層之后對于理論知識還是沒有一個深刻的概念,索性就動手用Java Socket API 模擬做一個HTTP服務器,鞏固一下應用層的知識。
HTTP基于TCP協(xié)議,協(xié)議采用了請求/響應模型??蛻舳讼蚍掌靼l(fā)送一個請求,請求頭包含請求的方法、URL、協(xié)議版本、以及包含請求修飾符、客戶信息和內(nèi)容的類似于MIME的消息結(jié)構(gòu)。服務器以一個狀態(tài)行作為響應,響應的內(nèi)容包括消息協(xié)議的版本,成功或者錯誤編碼加上包含服務器信息、實體元信息以及可能的實體內(nèi)容——百度百科。
話不多說,還是直接上圖。
具體字段這里不作解釋,不懂的請先自己了解http協(xié)議。這里主要是根據(jù)請求響應這一過程模擬HTTP服務器。
下面是代碼:
package com.example.httpserver; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class HttpServer { private static final Integer port = 80;//HTTP默認端口80 public static void main(String[] args) { ServerSocket serverSocket; try { //建立服務器Socket,監(jiān)聽客戶端請求 serverSocket = new ServerSocket(port); System.out.println("Server is running on port:"+serverSocket.getLocalPort()); //死循環(huán)不間斷監(jiān)聽客戶端請求 while(true){ final Socket socket = serverSocket.accept(); System.out.println("biuld a new tcp link with client,the cient address:"+ socket.getInetAddress()+":"+socket.getPort()); //并發(fā)處理HTTP客戶端請求 service(socket); } } catch (IOException e) { e.printStackTrace(); } } public static void service(Socket socket) { new Thread(){ public void run(){ InputStream inSocket; try { //獲取HTTP請求頭 inSocket = socket.getInputStream(); int size = inSocket.available(); byte[] buffer = new byte[size]; inSocket.read(buffer); String request = new String(buffer); System.out.println("ClientBrowser:\n"+request+"\n" + "------------------------------------------------------------------"); String firstLineOfRequest = ""; String[] heads; String uri = "/index.html"; String contentType =""; if(request.length() > 0){ firstLineOfRequest = request.substring(0,request.indexOf("\r\n")); heads = firstLineOfRequest.split(" "); uri = heads[1]; if(uri.indexOf("html") != -1){ contentType = "text/html"; }else{ contentType = "application/octet-stream"; } } //將響應頭發(fā)送給客戶端 String responseFirstLine = "HTTP/1.1 200 OK\r\n"; String responseHead = "Content-Type:" + contentType +"\r\n"; OutputStream outSocket = socket.getOutputStream(); System.out.println("ServerResponse:\n"+responseFirstLine+"\n"+responseHead+"\n" + "--------------------------------------------------------------------"); outSocket.write(responseFirstLine.getBytes()); outSocket.write(responseHead.getBytes()); //通過HTTP請求中的uri讀取相應文件發(fā)送給客戶端 FileInputStream writehtml = new FileInputStream(new File("wwwroot"+uri)); outSocket.write("\r\n".getBytes()); byte[] htmlbuffer = new byte[writehtml.available()]; if(writehtml !=null){ int len = 0; System.out.println("writeHtml"); while((len = writehtml.read(htmlbuffer)) != -1){ outSocket.write(htmlbuffer, 0,len); } } outSocket.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } }
代碼看注釋也很容易理解?,F(xiàn)在我們在瀏覽器中輸入服務器地址+要訪問的文件
在看我們控制臺輸出的內(nèi)容:
以上就是Java Socket 簡單的模擬HTTP服務器全過程。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
配置java環(huán)境變量(linux mac windows7)
本文給大家詳細總結(jié)介紹了Linux、MAC以及Windows下配置java環(huán)境變量的方法,非常的細致全面,有需要的小伙伴可以參考下2015-11-11Spring Boot接收單個String入?yún)⒌慕鉀Q方法
這篇文章主要給大家介紹了關(guān)于Spring Boot接收單個String入?yún)⒌慕鉀Q方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-11-11Spring使用@Conditional進行條件裝配的實現(xiàn)
在spring中有些bean需要滿足某些環(huán)境條件才創(chuàng)建某個bean,這個時候可以在bean定義上使用@Conditional注解來修飾,所以本文給大家介紹了Spring使用@Conditional進行條件裝配的實現(xiàn),文中通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下2023-12-12Java兩種方法計算出階乘尾部連續(xù)0的個數(shù)
這篇文章主要介紹了Java兩種方法計算出階乘尾部連續(xù)0的個數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03