程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java完成簡略單純Web辦事器

Java完成簡略單純Web辦事器

編輯:關於JAVA

Java完成簡略單純Web辦事器。本站提示廣大學習愛好者:(Java完成簡略單純Web辦事器)文章只能為提供參考,不一定能成為您想要的結果。以下是Java完成簡略單純Web辦事器正文


盡人皆知Web辦事器與客戶端之間的通訊是應用HTTP協定的。HTTP是一個客戶端和辦事器端要求和應對的尺度(TCP)。由於HTTP協定是基於TCP協定的,所以我將應用JAVA中的Socket完成這個簡略單純的Web辦事器。關於HTTP更具體的材料,列位可以查閱相干材料停止懂得。
在辦事器編寫之前,我們照樣先來看一下閱讀器與辦事器之間通訊的規矩究竟若何。
起首,我們是用ServerSocket來模仿一個辦事端,經由過程閱讀器拜訪,檢查閱讀器要求的內容:

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協定測試
 * 
 * @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,我們可以看到掌握台上輸入閱讀器的要求內容以下:

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

為了更好的剖析要求內容,我們編寫一個HTML頁面提交一些數據,再次檢查要求內容:

<!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,點擊按鈕提交,不雅察掌握台輸入:

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

我們來剖析一下這段要求內容:
第一行:由三部門構成,中央以空格離開,第一部門為要求辦法(GET、POST),第二部門為要求途徑和查詢參數,第三部門為HTTP協定版本(HTTP/1.1)
第二行到第十行:要求的頭信息,要求頭稱號與值之間經由過程:分隔
第十一行:空行
第十二行:提交的表單內容
綜上,我們可以獲得以下結論:要求信息第一行動要求辦法、要求途徑和查詢參數、HTTP協定版本,經由過程\r\n換行後緊隨著要求頭信息,各頭信息之間經由過程\r\n換行,要求頭信息停止後隨著一個空行,空行以後緊隨著一行動要求數據,須要留意的是,這外面只模仿了最簡略的表單提交,至於龐雜的文件提交等,這外面不評論辯論,要求內容格局略有分歧。
至此,客戶端要求的內容我們曾經曉得了,上面我們再來看看辦事端在吸收到要求後呼應數據的格局,我們新建一個Web項目用於測試,編纂Html頁面內容以下:

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

啟動辦事器,然後編寫客戶端測試代碼,取得辦事端前往數據:

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協定測試
 * 
 * @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);
  }
 }
}

運轉法式取得辦事器前往內容以下:

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協定版本(HTTP/1.1),第二部門為呼應狀況碼,第三部門為呼應狀況描寫
第二行到第七行動呼應頭信息,呼應頭稱號與值之間經由過程:分隔
第八行:空行
第九行到停止:呼應內容
綜上,我們可以獲得以下結論:要求信息第一行動HTTP協定版本、呼應狀況碼、呼應狀況描寫,經由過程\r\n換行後緊隨著呼應頭信息,各頭信息之間經由過程\r\n換行,呼應頭信息停止後隨著一個空行,空行以後緊隨著呼應數據,須要留意的是,除這類呼應外,其實還有其他的響應方法,好比chunk,此處不評論辯論,可查閱相干材料。

到如今為止,我們曾經剖析完了客戶真個要求內容格局和辦事端響應內容的格局,這一篇就到此為止了,願望對年夜家的進修有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved