一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - Java實現(xiàn)簡易Web服務(wù)器

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

2020-04-02 13:40蔣固金 JAVA教程

這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)簡易Web服務(wù)器的相關(guān)方法,想要制作Web服務(wù)器的朋友可以參考本文

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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é)議測試
 *
 * @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運行,并通過瀏覽器訪問:http://127.0.0.1,我們可以看到控制臺上輸出瀏覽器的請求內(nèi)容如下:

?
1
2
3
4
5
6
7
8
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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<!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,點擊按鈕提交,觀察控制臺輸出:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

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

?
1
2
3
4
5
6
7
8
9
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>test</title>
</head>
<body>this is test page.
</body>
</html>

啟動服務(wù)器,然后編寫客戶端測試代碼,獲得服務(wù)端返回數(shù)據(jù):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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é)議測試
 *
 * @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);
  }
 }
}

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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>

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费免费啪视频在线观播放 | 亚洲国产成人在线 | 91爱爱网站| 艾秋麻豆果冻剧传媒在线播放 | 国产亚洲玖玖玖在线观看 | 欧美日韩一区二区三区在线观看 | 四虎音影| www在线观看视频免费 | 亚洲精品久久7777777 | 久久久无码精品亚洲A片猫咪 | 欧美成人一区二区三区 | 五月天视频网 | 被夫上司强迫中文 | 免费标准高清看机机桶机机 | 女人把扒开给男人爽 | 免费aⅴ片 | 99久久99久久久精品齐齐鬼色 | 国产精品久久久久久久久久久威 | 99久久精品免费看国产情侣 | 美女脱了内裤打开腿让你桶爽 | 日韩影院在线 | 国产99久久九九精品免费 | 国产图片综合区 | 免费成年人在线视频 | brazzersvideo欧美最新 | 亚洲 综合 欧美在线 热 | videojapan日本孕交孕 | 王淑兰与铁柱全文免费阅读 | 女人被男人躁得好爽免费视频 | 欧美高清一级 | 日韩亚洲欧美一区二区三区 | 拔插拔插.com | 国内亚州视频在线观看 | 国产精品视频一区二区三区 | 色婷亚洲 | 日本不卡一区二区三区在线观看 | 精品在线看 | 99久久6er热免费精品 | 满溢游泳池免费土豪全集下拉版 | 日韩亚洲国产激情在线观看 | 草莓社区 |