最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)簡(jiǎn)易Web服務(wù)器

 更新時(shí)間:2016年02月23日 14:16:29   作者:蔣固金  
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)易Web服務(wù)器的相關(guān)方法,想要制作Web服務(wù)器的朋友可以參考本文

眾所周知Web服務(wù)器與客戶(hù)端之間的通信是使用HTTP協(xié)議的。HTTP是一個(gè)客戶(hù)端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)(TCP)。因?yàn)镠TTP協(xié)議是基于TCP協(xié)議的,所以我將使用JAVA中的Socket完成這個(gè)簡(jiǎn)易的Web服務(wù)器。關(guān)于HTTP更詳細(xì)的資料,各位可以查閱相關(guān)資料進(jìn)行了解。
在服務(wù)器編寫(xiě)之前,我們還是先來(lái)看一下瀏覽器與服務(wù)器之間通信的規(guī)則到底如何。
首先,我們是用ServerSocket來(lái)模擬一個(gè)服務(wù)端,通過(guò)瀏覽器訪(fǎng)問(wèn),查看瀏覽器請(qǐng)求的內(nèi)容:

import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

import org.junit.Test;

/**
 * HTTP協(xié)議測(cè)試
 * 
 * @author jianggujin
 * 
 */
public class HQHttpProtocolTest
{
 @Test
 public void server() throws Exception
 {
  ServerSocket serverSocket = new ServerSocket(80);
  Socket socket = serverSocket.accept();
  InputStream stream = socket.getInputStream();
  int r = -1;
  while ((r = stream.read()) != -1)
  {
   System.out.print((char) r);
  }
 }
}

使用junit運(yùn)行,并通過(guò)瀏覽器訪(fǎng)問(wèn):http://127.0.0.1,我們可以看到控制臺(tái)上輸出瀏覽器的請(qǐng)求內(nèi)容如下:

GET / HTTP/1.1
Host: 127.0.0.1
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537
.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8

為了更好的分析請(qǐng)求內(nèi)容,我們編寫(xiě)一個(gè)HTML頁(yè)面提交一些數(shù)據(jù),再次查看請(qǐng)求內(nèi)容:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>
<form method="post" action="http://127.0.0.1?test=123">
<input type="text" name="name"/>
<input type="submit"/>
</form>
</body>
</html>

在輸入框中輸入bob,點(diǎn)擊按鈕提交,觀察控制臺(tái)輸出:

POST /?test=123 HTTP/1.1
Host: 127.0.0.1
Connection: keep-alive
Content-Length: 8
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537
.36
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8

name=bob

我們來(lái)分析一下這段請(qǐng)求內(nèi)容:
第一行:由三部分組成,中間以空格分開(kāi),第一部分為請(qǐng)求方法(GET、POST),第二部分為請(qǐng)求路徑以及查詢(xún)參數(shù),第三部分為HTTP協(xié)議版本(HTTP/1.1)
第二行到第十行:請(qǐng)求的頭信息,請(qǐng)求頭名稱(chēng)與值之間通過(guò):分隔
第十一行:空行
第十二行:提交的表單內(nèi)容
綜上,我們可以得到如下結(jié)論:請(qǐng)求信息第一行為請(qǐng)求方法、請(qǐng)求路徑以及查詢(xún)參數(shù)、HTTP協(xié)議版本,通過(guò)\r\n換行后緊跟著請(qǐng)求頭信息,各頭信息之間通過(guò)\r\n換行,請(qǐng)求頭信息結(jié)束后跟著一個(gè)空行,空行之后緊跟著一行為請(qǐng)求數(shù)據(jù),需要注意的是,這里面只模擬了最簡(jiǎn)單的表單提交,至于復(fù)雜的文件提交等,這里面不討論,請(qǐng)求內(nèi)容格式略有不同。
至此,客戶(hù)端請(qǐng)求的內(nèi)容我們已經(jīng)知道了,下面我們?cè)賮?lái)看看服務(wù)端在接收到請(qǐng)求后響應(yīng)數(shù)據(jù)的格式,我們新建一個(gè)Web項(xiàng)目用于測(cè)試,編輯Html頁(yè)面內(nèi)容如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>this is test page.
</body>
</html>

啟動(dòng)服務(wù)器,然后編寫(xiě)客戶(hù)端測(cè)試代碼,獲得服務(wù)端返回?cái)?shù)據(jù):

import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

import org.junit.Test;

/**
 * HTTP協(xié)議測(cè)試
 * 
 * @author jianggujin
 * 
 */
public class HQHttpProtocolTest
{

 public void server() throws Exception
 {
  ServerSocket serverSocket = new ServerSocket(80);
  Socket socket = serverSocket.accept();
  InputStream stream = socket.getInputStream();
  // BufferedInputStream inputStream = new BufferedInputStream(stream);
  int r = -1;
  while ((r = stream.read()) != -1)
  {
   System.out.print((char) r);
  }
 }

 @Test
 public void client() throws Exception
 {
  Socket socket = new Socket("127.0.0.1", 80);
  BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
   socket.getOutputStream()));
  writer.write("GET /Servlet/test.html HTTP/1.1\r\n");
  writer.write("Host: 127.0.0.1\r\n");
  writer.write("Connection: keep-alive\r\n");
  writer.write("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n");
  writer.write("User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36\r\n");
  writer.write("Accept-Encoding: gzip,deflate,sdch\r\n");
  writer.write("Accept-Language: zh-CN,zh;q=0.8\r\n");
  writer.write("\r\n");
  writer.flush();
  InputStream stream = socket.getInputStream();
  int r = -1;
  while ((r = stream.read()) != -1)
  {
   System.out.print((char) r);
  }
 }
}

運(yùn)行程序獲得服務(wù)器返回內(nèi)容如下:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"129-1456125361109"
Last-Modified: Mon, 22 Feb 2016 07:16:01 GMT
Content-Type: text/html
Content-Length: 129
Date: Mon, 22 Feb 2016 08:08:32 GMT

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>this is test page.
</body>
</html>

同樣的,我們來(lái)分析一下這段返回消息:
第一行由三部分組成,中間以空格分開(kāi),第一部分為HTTP協(xié)議版本(HTTP/1.1),第二部分為響應(yīng)狀態(tài)碼,第三部分為響應(yīng)狀態(tài)描述
第二行到第七行為響應(yīng)頭信息,響應(yīng)頭名稱(chēng)與值之間通過(guò):分隔
第八行:空行
第九行到結(jié)束:響應(yīng)內(nèi)容
綜上,我們可以得到如下結(jié)論:請(qǐng)求信息第一行為HTTP協(xié)議版本、響應(yīng)狀態(tài)碼、響應(yīng)狀態(tài)描述,通過(guò)\r\n換行后緊跟著響應(yīng)頭信息,各頭信息之間通過(guò)\r\n換行,響應(yīng)頭信息結(jié)束后跟著一個(gè)空行,空行之后緊跟著響應(yīng)數(shù)據(jù),需要注意的是,除這種響應(yīng)外,其實(shí)還有其他的相應(yīng)方式,比如chunk,此處不討論,可查閱相關(guān)資料。

到現(xiàn)在為止,我們已經(jīng)分析完了客戶(hù)端的請(qǐng)求內(nèi)容格式以及服務(wù)端相應(yīng)內(nèi)容的格式,這一篇就到此為止了,希望對(duì)大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • java實(shí)現(xiàn)馬踏棋盤(pán)的算法

    java實(shí)現(xiàn)馬踏棋盤(pán)的算法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)馬踏棋盤(pán)的算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 基于JavaMail的Java郵件發(fā)送

    基于JavaMail的Java郵件發(fā)送

    電子郵件的應(yīng)用非常廣泛,例如在某網(wǎng)站注冊(cè)了一個(gè)賬戶(hù),自動(dòng)發(fā)送一封歡迎郵件,通過(guò)郵件找回密碼,自動(dòng)批量發(fā)送活動(dòng)信息等。本文將簡(jiǎn)單介紹如何通過(guò) Java 代碼來(lái)創(chuàng)建電子郵件,并連接郵件服務(wù)器發(fā)送郵件
    2021-10-10
  • java實(shí)現(xiàn)簡(jiǎn)單汽車(chē)租賃系統(tǒng)

    java實(shí)現(xiàn)簡(jiǎn)單汽車(chē)租賃系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單汽車(chē)租賃系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • SpringBoot注冊(cè)FilterRegistrationBean相關(guān)情況講解

    SpringBoot注冊(cè)FilterRegistrationBean相關(guān)情況講解

    這篇文章主要介紹了SpringBoot注冊(cè)FilterRegistrationBean相關(guān)情況,借助FilterRegistrationBean來(lái)注冊(cè)filter,可以避免在web.xml種配置filter這種原始的寫(xiě)法
    2023-02-02
  • 淺析如何在Java應(yīng)用中優(yōu)雅的發(fā)送短信

    淺析如何在Java應(yīng)用中優(yōu)雅的發(fā)送短信

    很多業(yè)務(wù)場(chǎng)景里,我們都需要發(fā)送短信,比如登陸驗(yàn)證碼、告警、營(yíng)銷(xiāo)通知、節(jié)日祝福等等,這篇文章,我們聊聊 Java 應(yīng)用中如何優(yōu)雅的發(fā)送短信,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2023-11-11
  • Java讀取Excel、docx、pdf和txt等文件萬(wàn)能方法舉例

    Java讀取Excel、docx、pdf和txt等文件萬(wàn)能方法舉例

    在Java開(kāi)發(fā)中處理文件是常見(jiàn)需求,本文以實(shí)際代碼示例詳述如何使用ApachePOI庫(kù)及其他工具讀取和寫(xiě)入Excel、Word、PDF等文件,介紹了ApachePOI、ApachePDFBox和EasyExcel等庫(kù)的使用方法,幫助開(kāi)發(fā)者有效讀取不同格式文件,需要的朋友可以參考下
    2024-09-09
  • Java實(shí)現(xiàn)復(fù)制文件并命名的超簡(jiǎn)潔寫(xiě)法

    Java實(shí)現(xiàn)復(fù)制文件并命名的超簡(jiǎn)潔寫(xiě)法

    這篇文章主要介紹了Java實(shí)現(xiàn)復(fù)制文件并命名的超簡(jiǎn)潔寫(xiě)法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java打成各種壓縮包的方法詳細(xì)匯總

    Java打成各種壓縮包的方法詳細(xì)匯總

    在工作過(guò)程中,需要將一個(gè)文件夾生成壓縮文件,然后提供給用戶(hù)下載,下面這篇文章主要給大家介紹了關(guān)于Java打成各種壓縮包的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • 使用IDEA創(chuàng)建maven父子工程項(xiàng)目 (圖文)

    使用IDEA創(chuàng)建maven父子工程項(xiàng)目 (圖文)

    本文主要介紹了使用IDEA創(chuàng)建maven父子工程項(xiàng)目,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Java內(nèi)存緩存工具Guava LoadingCache使用解析

    Java內(nèi)存緩存工具Guava LoadingCache使用解析

    這篇文章主要介紹了Java內(nèi)存緩存工具Guava LoadingCache使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評(píng)論

九台市| 义乌市| 桐乡市| 金川县| 砀山县| 商南县| 庆安县| 丰顺县| 开江县| 凤庆县| 易门县| 张掖市| 金昌市| 团风县| 汽车| 洮南市| 宝山区| 阿巴嘎旗| 恩施市| 永和县| 平顺县| 安多县| 岑溪市| 临城县| 民丰县| 扶风县| 承德县| 邵东县| 台南县| 宁强县| 漳州市| 丰镇市| 田阳县| 嘉鱼县| 十堰市| 称多县| 郴州市| 渭源县| 临漳县| 浦东新区| 基隆市|