国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java實現Http服務器之一

2019-11-18 14:52:29
字體:
來源:轉載
供稿:網友
    本文將具體介紹如何基于java語言實現一個簡單的Http服務器,文中將主要介紹三個方面的內容:
1)Http協議的基本知識
2)java.net.Socket類
3)java.net.ServerSocket類
讀完本文后你可以把這個服務器用多線程的技術重新編寫一個更好的服務器。

    由于Web服務器使用Http協議通信的因此也把它叫做Http服務器,Http使用可靠的TCP連接來工作,它是面向連接的通信方式,這意味著客戶端和服務器每次通信都建立自己的連接,它又是無狀態的連接,當數據傳輸完畢后客戶端和服務器端的連接馬上關閉,這樣可以節省服務器的資源,當然假如需要傳輸大量的數據,你可以在Request的頭設置Connection=keep-alive使得可以復用這一個連接通道。在HTTP協議中非常重要的兩個概念就是:請求(Request)和(響應)這也是我在這里要講述的假如你想了解Http更多的內容那么請參考RTF2616。

    一個Http請求包括三個重要的部分:
1)Method-URI-PRotocol/Version
2)Request headers
3)Entity body 

下面是一個Http請求的例子:
POST /servlet/default.jsp HTTP/1.1
Accept: text/plain; text/Html
Accept-Language: en-gb
Connection: Keep-Alive
Host: localhost
Referer: http://localhost/ch8/SendDetails.htm
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Content-Length: 33
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate

LastName=Franks&FirstName=Michael

     其中第一行是Method-URI-Protocol/Version ,這是非常重要的部分,你需要從中讀取客戶端數據傳輸的方式,URI以及協議和版本,在這里分別是POST / servlet/default.jsp http/1.1,我們的簡單的服務器的思路就是從request中得到URI后在你的服務器上找到這個資源,比如是一個靜態的html頁面,然后把它發送給瀏覽器。記住URI是相對于你的HTTP服務器的根目錄的,所以以/來開頭。接下來的部分是請求頭信息它們都是以name:value這樣的方式構成的,這里不再多介紹了。在Header和Entity body之間有一空行叫做CRLF,這用來標記Entity body的開始的,意思是下面的是傳輸的數據了。

     HTTP響應和請求非常相似,同樣包括三個部分:
1)Protocol-Status code-Description
2)Response headers
3)Entity body

下面是一個具體的例子:
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 3 Jan 1998 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 11 Jan 1998 13:23:42 GMT
Content-Length: 112

something  in html style......................
通常在J2ME聯網中我們需要判定響應的狀態碼來決定下一步的操作,比如200代表連接成功。現在你應該清楚為什么這么做了吧。同樣在Header和Entity body中有一個CRLF分割。

    現在我們來看看java中的Socket類,socket其實是對編程語言的一種抽象,它提供了在網絡上端對端訪問的可能,但是它并不依靠于編程語言,你完全可以使用java和c語言通過socket來進行通信,在java中是通過java.net.Socket來實現的,當你要構建一個socket的時候,你只是需要調用它的構造器
public Socket(String host,int port),其中host代表目標主機的地址或名字,port代表端口,比如80。當我們創建了一個Socket的實例后我們就可以進行通信了,假如你要基于字節來通信,那么你可以通過調用getOutputStream()和getInputStream()來得到OutputStream和InputStream的對象,假如你是基于字符通信的話那么你可以用PrintWriter和BufferedReader進行二次包裝,例如PrintWriter pw = new PrintWriter(socket.getOutputStream(),true)。下面是簡單的使用socket通信的代碼片斷,實現了向127.0.0.1:8080發送Http請求的功能



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盘山县| 襄城县| 宜黄县| 普兰店市| 普定县| 长顺县| 临漳县| 阿克陶县| 永泰县| 大宁县| 云阳县| 兴安县| 固原市| 佛学| 准格尔旗| 江阴市| 博客| 武邑县| 无锡市| 区。| 边坝县| 沭阳县| 昭觉县| 冀州市| 任丘市| 常宁市| 黄大仙区| 宜阳县| 随州市| 望谟县| 开阳县| 巫溪县| 东台市| 承德县| 西贡区| 沈丘县| 文昌市| 泾川县| 民县| 靖安县| 信宜市|