亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java網絡編程由淺入深四 編寫自己的HTTP服務器

2019-11-06 06:53:22
字體:
來源:轉載
供稿:網友

編寫自己的服務

通過前面相關的學習已經具備編寫自己HTTP服務器的能力,不管是通過阻塞還是非阻塞的方式都可以實現。但是這里需要對HTTP協議進行一個了解。


HTTP協議簡介

當用戶打開瀏覽器,輸入一個URL地址,就能收到遠程HTTP服務器發送過來的網頁。瀏覽器就是最常見的HTTP客戶程序。

HTTP請求格式

HTTP協議規定,HTTP請求由3部分構成,分別是:

請求方式、URI、HTTP協議的版本請求頭請求正文

下面是一個HTTP請求的例子:

GET / HTTP/1.1Host: www.google.com.hkConnection: keep-aliveCache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36X-Chrome-UMA-Enabled: 1X-Client-Data: CJS2yQEipbbJAQjEtskBCOKYygEI+5zKAQipncoBAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding: gzip, deflate, sdch, brAccept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4Cookie: NID=98=EmnQgFsnopWExg1XEQNjPR1FKwTo1T7Qk5fH94bdjmUqIdJ6L9C_LLziCX8_UcDv_iyo84kOgKMPTnP0pbfuJqigpoxfDWouhyKX58J_gn2HU1abg7UJFik2bhwSHIU9kpJIEvQ6rtigHffscUqanx5_Tb-F1yq_4WiaBGjINA_A9siROY-WPTka8eRvElgyXk7koHQK

GET / HTTP/1.1 分別表示 請求方式(GET) URI(/) 協議版本(HTTP/1.1) 根據HTTP協議,HTTP請求可以使用多種方式:

GET:這種方式最為常見,客戶程序可以通過這種方式訪問服務器上的文檔。POST:客戶程序可通過這種方式發送大量信息給服務器。例如HTML的表單提交。HEAD:客戶端和服務器之間交流一些內部書籍,服務器不會返回具體的文檔。PUT:客戶程序通過這種方式把文檔上傳給服務器。DELETE:客戶程序通過這種方式刪除服務器上的某個文檔。

請求頭: 請求頭包含許多有關客戶端環境和請求正文的有用信息。例如,請求頭可以申明瀏覽器類型,所用的語言,請求正文的類型,已經請求正文的長度。

Host: www.google.com.hkConnection: keep-aliveCache-Control: max-age=0Upgrade-Insecure-Requests: 1User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36X-Chrome-UMA-Enabled: 1X-Client-Data: CJS2yQEIpbbJAQjEtskBCOKYygEI+5zKAQipncoBAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding: gzip, deflate, sdch, brAccept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4Cookie: NID=98=EmnQgFsnopWExg1XEQNjPR1FKwTo1T7Qk5fH94bdjmUqIdJ6L9C_LLziCX8_UcDv_iyo84kOgKMPTnP0pbfuJqigpoxfDWouhyKX58J_gn2HU1abg7UJFik2bhwSHIU9kpJIEvQ6rtigHffscUqanx5_Tb-F1yq_4WiaBGjINA_A9siROY-WPTka8eRvElgyXk7koHQK

請求正文:

HTTP協議規定,請求頭和請求正文之間必須以空行分給(只有CRLF[就是回車(CR, ASCII 13, /r) 換行(LF, ASCII 10, /n)。]符號的行),這個空行表示請求頭已經結束,接下來是請求正文。下面是POST請求方式提交的表單數據

username=weixin&passWord=1234

HTTP響應格式

與HTTP請求相比,HTTP響應格式也由3部分構成:

HTTP協議版本、狀態碼、描述響應頭(Response Header)響應正文(Response Content)

下面是一個HTTP響應的例子:

HTTP/1.1 200 OKDate: Sun, 05 Mar 2017 04:31:31 GMTExpires: -1Cache-Control: private, max-age=0Content-Type: text/html; charset=UTF-8Server: gwsX-XSS-Protection: 1; mode=blockX-Frame-Options: SAMEORIGINAlt-Svc: quic=":443"; ma=2592000; v="36,35,34"Transfer-Encoding: chunked

HTTP協議的版本、狀態碼、描述

HTTP響應的第一行包括服務器使用的HTTP協議的版本,狀態碼、以及對狀態的代碼的描述。這三項以空格分開。HTTP/1.1 200 OK

狀態碼:

狀態碼是一個3位整數,以1、2、3、4或5開頭。

1XX :信息提示,表示臨時的響應。2XX:響應成功,表示服務器成功接收了客戶端的請求。3XX:重定向。4XX:客戶端錯誤,表明客戶端請求了不正確的資源或請求格式錯誤。5XX:服務器錯誤,表明服務器由于遇到某種錯誤而不能響應客戶請求。

以下是一些常見的狀態碼:

200:響應成功。400:錯誤的請求??蛻舭l送的HTTP請求不正確。404:文件不存在。在服務端沒有客戶端請求的文檔。405:服務器不支持客戶端的請求方式。500:服務器內部錯誤。

響應頭: 響應頭也和請求頭一樣包含許多有用的信息。例如,服務器類型,正文類型。

Content-Type: text/html; charset=UTF-8Server: gws

請求正文 在上面的響應格式中沒有列出響應正文,因為是通過chrome查看的。chrome將響應正文放到另外的地方,因為響應正文一般都比較大。如下圖 這里寫圖片描述 通過HTTP響應頭與響應正文之間必須用空行分隔。

創建一個簡單的HTTP服務器

通過ServerSocketChannel、SocketChannelBuffer 以及線程池實現:

/** * 簡單的HTTP服務器 * * @author 在路上的coder * @create 2017-03-05 14:43 **/public class SimpleHttpServer { private int port = 80; private ServerSocketChannel serverSocketChannel; private ExecutorService executorService; private static final int POOL_SIZE = 4; private Charset charset = Charset.forName("UTF-8"); public SimpleHttpServer() throws IOException { executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * POOL_SIZE); serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.socket().setReuseAddress(true); serverSocketChannel.socket().bind(new InetSocketAddress(port)); System.out.println("服務器啟動成功"); } public String decode(ByteBuffer byteBuffer) { return charset.decode(byteBuffer).toString(); } public ByteBuffer encode(String string) { return charset.encode(string); } public void service() { while (true) { SocketChannel socketChannel = null; try { socketChannel = serverSocketChannel.accept(); executorService.execute(new Handler(socketChannel)); } catch (IOException e) { e.printStackTrace(); } } } class Handler implements Runnable { private SocketChannel socketChannel; public Handler(SocketChannel socketChannel) { this.socketChannel = socketChannel; } @Override public void run() { handle(serverSocketChannel); } private void handle(ServerSocketChannel serverSocketChannel) { try { Socket socket = socketChannel.socket(); System.out.println("接收到客戶鏈接,來自:" + socket.getInetAddress() + ":" + socket.getPort()); ByteBuffer buffer = ByteBuffer.allocate(1024); socketChannel.read(buffer);//接收http請求,假定其長度不會超過1024個字節 buffer.flip();//將limit的位置設為position,將position的值設置為0 String request = decode(buffer); System.out.println("請求數據是:"); System.out.println(request); System.out.println(); //生成HTTP響應結果 StringBuffer sb = new StringBuffer("HTTP/1.1 200 OK/r/n"); sb.append("Content-Type:text/html/r/n/r/n"); socketChannel.write(encode(sb.toString()));//發送HTTP響應的第一行和響應頭 FileInputStream in; //獲取http請求的第一行 String firstLineOfRequest = request.substring(0, request.indexOf("/r/n")); if (firstLineOfRequest.indexOf("login.html") != -1) { in = new FileInputStream("E://application//JetBrains//workspace//newWork//nio//src//login.html"); } else { in = new FileInputStream("E://application//JetBrains//workspace//newWork//nio//src//hello.html"); } FileChannel fileChannel = in.getChannel(); fileChannel.transferTo(0,fileChannel.size(),socketChannel); } catch (IOException e) { e.printStackTrace(); }finally { if(socketChannel!=null){ try { socketChannel.close(); } catch (IOException e) { e.printStackTrace(); } } } } } public static void main(String[] args) throws IOException { new SimpleHttpServer().service(); }}

訪問方式 在瀏覽器輸入 http://localhost/login.html 出現login頁面,輸入username和password。

在服務端控制臺輸出如下: 這里寫圖片描述

這個圖的請求數據就是完整的包含:請求方式,URI、協議版本、請求頭、請求正文。


歡迎關注微信公眾號 在路上的coder 每天分享優秀的java技術文章,還有學習視頻分享! 掃描二維碼關注:這里寫圖片描述


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97在线视频免费| 欧美日韩午夜激情| 久久久国产一区| 91网站在线看| 在线观看精品国产视频| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品入口日韩视频大尺度| 亚洲第一偷拍网| 亚洲乱码国产乱码精品精天堂| 欧美高清电影在线看| 欧美国产极速在线| 欧美精品videos| 亚洲人成电影在线播放| 久久久久久国产精品久久| 成人午夜黄色影院| 欧美与欧洲交xxxx免费观看| 人妖精品videosex性欧美| 91精品国产一区| 精品视频久久久久久久| 国自在线精品视频| 久热国产精品视频| 国产乱肥老妇国产一区二| 亚洲伊人久久综合| 日韩精品小视频| 国产日韩欧美视频| 欧美中文字幕精品| 亚洲欧美在线第一页| 国产美女直播视频一区| 中文字幕精品在线视频| 91精品国产综合久久香蕉最新版| 久国内精品在线| 日韩欧美在线视频免费观看| 中文字幕亚洲一区在线观看| 日韩视频永久免费观看| 国产欧美一区二区三区在线看| 国产成人91久久精品| 亚洲人成电影网| 日韩成人av在线播放| 亚洲精品福利资源站| 久久久久久久电影一区| 亚洲欧美国产高清va在线播| 91精品在线影院| 日韩成人av在线播放| 亚洲欧美自拍一区| 78色国产精品| 欧美性在线观看| 欧美插天视频在线播放| 欧美日韩亚洲国产一区| 午夜精品久久久久久99热| 国产97在线|亚洲| 亚洲欧美精品一区二区| 国外成人性视频| 国产精品欧美在线| 精品国产成人av| 久久亚洲一区二区三区四区五区高| 亚洲国产精品成人一区二区| 色999日韩欧美国产| 国产高清视频一区三区| 深夜福利亚洲导航| 日韩精品一二三四区| 精品一区二区三区四区| 精品偷拍各种wc美女嘘嘘| 久久成人精品电影| 国产热re99久久6国产精品| 久久人人97超碰精品888| 欧美精品情趣视频| 久久视频在线观看免费| 成人性生交大片免费看视频直播| 色www亚洲国产张柏芝| 欧美久久久精品| 欧美福利小视频| 国内精品中文字幕| 欧美日韩国产限制| 揄拍成人国产精品视频| 91九色综合久久| 97av在线视频免费播放| www.久久色.com| 国产偷国产偷亚洲清高网站| 在线播放精品一区二区三区| 色偷偷91综合久久噜噜| 国产精品精品视频| 51精品在线观看| 亚洲精品一区久久久久久| 91黑丝在线观看| 北条麻妃99精品青青久久| 欧美激情按摩在线| 欧美电影免费播放| 国产v综合v亚洲欧美久久| 国产精品你懂得| 久久成人在线视频| 欧美精品激情视频| 国产精品欧美一区二区三区奶水| 欧美肥老太性生活视频| 欧美高清视频一区二区| 国产精品高潮粉嫩av| 欧美在线视频网| 欧美精品videosex极品1| 欧美性高潮床叫视频| 欧美日韩亚洲精品一区二区三区| 欧洲成人性视频| 久久精品99久久香蕉国产色戒| 日韩av在线看| 久久精品成人欧美大片| 成人免费观看a| 国产极品jizzhd欧美| 欧美午夜精品在线| 综合欧美国产视频二区| 国产成人精品在线播放| 国产91在线高潮白浆在线观看| 欧美另类高清videos| 国产欧美日韩高清| 91精品视频在线看| 中文字幕欧美在线| 欧美综合激情网| 亚洲精品久久久久久久久| 欧美一区三区三区高中清蜜桃| 日韩久久免费电影| 欧美精品久久久久a| 欧美高清在线视频观看不卡| 久久在线精品视频| 国产午夜精品免费一区二区三区| 亚洲精品国产suv| 精品欧美激情精品一区| 91免费福利视频| 日韩中文字幕网站| 久久久久北条麻妃免费看| 亚洲娇小xxxx欧美娇小| 欧美日韩一区二区在线| 亚洲最大成人网色| 国产精品免费一区| 91精品国产自产91精品| 国产日韩中文在线| 成人伊人精品色xxxx视频| 欧美激情欧美激情在线五月| 一区二区亚洲欧洲国产日韩| 欧美精品18videosex性欧美| 尤物九九久久国产精品的特点| 欧美精品激情视频| 日韩欧美极品在线观看| 国产精品视频999| 美女视频黄免费的亚洲男人天堂| 亚洲在线一区二区| 亚洲色图美腿丝袜| 欧美极品在线视频| 欧美丝袜一区二区| 日韩精品视频中文在线观看| 亚洲人成电影网| 91在线|亚洲| 色综合久久久久久中文网| 欧美www在线| 欧美性xxxxx| 欧美性感美女h网站在线观看免费| 国产精品xxx视频| 精品中文视频在线| 亚洲国产第一页| 2020国产精品视频| 成人免费激情视频| 国产999视频| 日韩欧美国产成人| 国产精品九九九| 亚洲一区久久久| 美乳少妇欧美精品| 国产丝袜视频一区| 亚洲欧美一区二区激情|