這篇文章將為大家詳細(xì)講解有關(guān)如何動(dòng)手實(shí)現(xiàn)靜態(tài)資源服務(wù)器,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)達(dá)日免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000+企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
利用java自帶的socket編程實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的靜態(tài)資源服務(wù)器,可以響應(yīng)靜態(tài)資源。
本文一共有兩個(gè)版本的源碼。第一個(gè)版本名為Server_v1,該版本實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的socket的服務(wù)器,幫助讀者回憶socket編程。第二個(gè)版本名為Server_v2,該版本是對(duì)第一版的改良,給出了改良思路,做出了必要的封裝,讓其能夠響應(yīng)css、html、jpg等靜態(tài)資源。
該版本實(shí)現(xiàn)一個(gè)簡(jiǎn)單的socket服務(wù)器,針對(duì)瀏覽器的請(qǐng)求,能夠返回相應(yīng)的頁(yè)面。
其源碼如下:
package mytomcat_v1;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.Date;public class Server_V1 { public static void main(String[] args) { ServerSocket serverSocket = null; Socket client = null; try { serverSocket = new ServerSocket(9999); while (true) { client = serverSocket.accept(); InputStream in = client.getInputStream(); byte[] buff = new byte[1024]; int len = in.read(buff); if (len > 0) { String msg = new String(buff, 0, len); System.out.println("===="+msg+"======"); OutputStream out = client.getOutputStream(); StringBuffer sb = new StringBuffer(); sb.append("HTTP/1.1 200 OK\n"); sb.append("Content-Type: text/html; charset=UTF-8\n"); sb.append("\n"); String html="<html><head><title>賣燒餅咯</title></head></html><body>小曲經(jīng)常在" +"<font size='14' color='red'>" +new Date() +"</font>" +"<br/>賣燒餅</body></html>"; sb.append(html); out.write(sb.toString().getBytes()); out.flush(); out.close(); } } } catch (Exception e) { } } }
執(zhí)行效果如下圖所示,打開(kāi)chrome瀏覽器,在導(dǎo)航欄輸入
http:
顯示如下圖所示
控制臺(tái)輸出如下圖所示
====GET /docs/index.html HTTP/1.1Host: localhost:9999Connection: keep-alive Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9======
該版本在版本一的基礎(chǔ)上進(jìn)行優(yōu)化,使其能夠有效的響應(yīng)靜態(tài)資源
先看第一部分代碼優(yōu)化,如下圖所示
紅框的部分,我們可以理解為對(duì)請(qǐng)求信息對(duì)處理,因此我們模仿Tomcat構(gòu)造一個(gè)HttpRequst來(lái)處理這一段邏輯。
另外,我們需要對(duì)靜態(tài)資源進(jìn)行響應(yīng),因此我們需要獲取輸入內(nèi)容的靜態(tài)資源地址,即以下部分的內(nèi)容。
獲取以上紅框請(qǐng)求地址內(nèi)容的代碼如下
uri = msg.substring(msg.indexOf("/"),msg.indexOf("HTTP/1.1") - 1);
綜上所述,我們有HttpRequest類如下所示
package mytomcat_v2; import java.io.IOException; import java.io.InputStream;public class HttpRequest { private String uri; public String getUri() { return uri; } public HttpRequest(InputStream in) throws IOException { resolverRequest(in); } private void resolverRequest(InputStream in) throws IOException { byte[] buff = new byte[1024]; int len = in.read(buff); if (len > 0) { String msg = new String(buff, 0, len); System.out.println("====" + msg + "======"); uri = msg.substring(msg.indexOf("/"), msg.indexOf("HTTP/1.1") - 1); } else { System.out.println("bad Request!"); } } }
接下來(lái)是第二部分的代碼優(yōu)化,如下圖所示
以上紅框部分主要是對(duì)輸出信息進(jìn)行響應(yīng),我們模仿tomcat構(gòu)造一個(gè)HttpResponse對(duì)象封裝該部分邏輯。
另外,我們獲取用戶請(qǐng)求的資源文件路徑,根據(jù)該路徑找到相應(yīng)靜態(tài)文件。將該文件寫(xiě)入文件流,輸出。
因此,我們有HttpResponse對(duì)象如下所示
package mytomcat_v2;import java.io.FileInputStream;import java.io.IOException;import java.io.OutputStream;public class HttpResponse { private OutputStream os = null; public HttpResponse(OutputStream os) { this.os = os; } public void writerFile(String path) throws IOException { FileInputStream fileInputStream = new FileInputStream(path); byte[] buff = new byte[1024]; int len = 0; StringBuffer sb = new StringBuffer(); sb.append("HTTP/1.1 200 OK\n"); sb.append("Content-Type: text/html; charset=UTF-8\n"); sb.append("\n"); os.write(sb.toString().getBytes()); while ((len = fileInputStream.read(buff)) != -1) { os.write(buff, 0, len); } fileInputStream.close(); os.flush(); os.close(); } }
接下來(lái)我們構(gòu)建測(cè)試類,構(gòu)建之前我們先去找一些靜態(tài)資源文件。作者直接去apache的官網(wǎng)下把tomcat給下了下來(lái),然后去如下目錄拷貝靜態(tài)資源文件
apache-tomcat-8.5.28/webapps/docs
將整個(gè)docs 文件夾拷貝至你的項(xiàng)目的根目錄下
apache-tomcat-8.5.28/webapps/ROOT/favicon.ico
將favicon.ico圖片拷貝至你的根目錄下
靜態(tài)資源在你的項(xiàng)目中的結(jié)構(gòu)如下圖所示
現(xiàn)在上我們的Server_V2的代碼
package mytomcat_v2;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.Date;public class Server_V2 { public static void main(String[] args) { ServerSocket serverSocket = null; Socket client = null; try { serverSocket = new ServerSocket(9999); while (true) { client = serverSocket.accept(); InputStream in = client.getInputStream(); HttpRequest request = new HttpRequest(in); String requestUri = request.getUri(); OutputStream os = client.getOutputStream(); HttpResponse response = new HttpResponse(os); response.writerFile(requestUri.substring(1)); client.close(); } } catch (Exception e) { e.printStackTrace(); } } }
測(cè)試結(jié)果如下:
在瀏覽器輸入
http:
效果如下
你會(huì)驚奇的發(fā)現(xiàn)樣式并不能識(shí)別,因此我們對(duì)響應(yīng)頭的部分邏輯進(jìn)行修改
將
sb.append("HTTP/1.1 200 OK\n"); sb.append("Content-Type: text/html; charset=UTF-8\n"); sb.append("\n");
部分修改為
if(path.endsWith("css")) { sb.append("HTTP/1.1 200 OK\n"); sb.append("Content-Type: text/css; charset=UTF-8\n"); sb.append("\n"); }else { sb.append("HTTP/1.1 200 OK\n"); sb.append("Content-Type: text/html; charset=UTF-8\n"); sb.append("\n"); }
繼續(xù)啟動(dòng)測(cè)試,效果如下
已經(jīng)能夠正常顯示。
關(guān)于如何動(dòng)手實(shí)現(xiàn)靜態(tài)資源服務(wù)器就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
當(dāng)前標(biāo)題:如何動(dòng)手實(shí)現(xiàn)靜態(tài)資源服務(wù)器
文章位置:http://jinyejixie.com/article42/jjhshc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站維護(hù)、小程序開(kāi)發(fā)、品牌網(wǎng)站設(shè)計(jì)、云服務(wù)器、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)