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

首頁 > 編程 > Java > 正文

簡單實現Java web服務器

2019-11-26 14:10:09
字體:
來源:轉載
供稿:網友

一個簡單的Java web服務器實現,比較簡單,基于java.net.Socket和java.net.ServerSocket實現;
一、程序執行步驟
 1.創建一個ServerSocket對象;
 2.調用ServerSocket對象的accept方法,等待連接,連接成功會返回一個Socket對象,否則一直阻塞等待;
 3.從Socket對象中獲取InputStream和OutputStream字節流,這兩個流分別對應request請求和response響應;
 4.處理請求:讀取InputStream字節流信息,轉成字符串形式,并解析,這里的解析比較簡單,僅僅獲取uri(統一資源標識符)信息;
 5.處理響應:根據解析出來的uri信息,從WEB_ROOT目錄中尋找請求的資源資源文件, 讀取資源文件,并將其寫入到OutputStream字節流中;
 6.關閉Socket對象;
 7.轉到步驟2,繼續等待連接請求; 

二、代碼實現

 服務器實現: 

package ex01.pyrmont;import java.net.Socket;import java.net.ServerSocket;import java.net.InetAddress;import java.io.InputStream;import java.io.OutputStream;import java.io.IOException;import java.io.File;public class HttpServer { /** * WEB_ROOT是HTML和其它文件存放的目錄. 這里的WEB_ROOT為工作目錄下的webroot目錄 */ public static final String WEB_ROOT = System.getProperty("user.dir") + File.separator + "webroot"; // 關閉服務命令 private static final String SHUTDOWN_COMMAND = "/SHUTDOWN"; public static void main(String[] args) { HttpServer server = new HttpServer(); //等待連接請求 server.await(); } public void await() { ServerSocket serverSocket = null; int port = 8080; try {  //服務器套接字對象  serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1")); } catch (IOException e) {  e.printStackTrace();  System.exit(1); } // 循環等待一個請求 while (true) {  Socket socket = null;  InputStream input = null;  OutputStream output = null;  try {  //等待連接,連接成功后,返回一個Socket對象  socket = serverSocket.accept();  input = socket.getInputStream();  output = socket.getOutputStream();  // 創建Request對象并解析  Request request = new Request(input);  request.parse();  // 檢查是否是關閉服務命令  if (request.getUri().equals(SHUTDOWN_COMMAND)) {   break;  }  // 創建 Response 對象  Response response = new Response(output);  response.setRequest(request);  response.sendStaticResource();  // 關閉 socket 對象  socket.close();    } catch (Exception e) {  e.printStackTrace();  continue;  } } }}

Request類: 

package ex01.pyrmont;import java.io.InputStream;import java.io.IOException;public class Request { private InputStream input; private String uri; public Request(InputStream input) { this.input = input; } //從InputStream中讀取request信息,并從request中獲取uri值 public void parse() { StringBuffer request = new StringBuffer(2048); int i; byte[] buffer = new byte[2048]; try {  i = input.read(buffer); } catch (IOException e) {  e.printStackTrace();  i = -1; } for (int j = 0; j < i; j++) {  request.append((char) buffer[j]); } System.out.print(request.toString()); uri = parseUri(request.toString()); } /** *  * requestString形式如下: * GET /index.html HTTP/1.1 * Host: localhost:8080 * Connection: keep-alive * Cache-Control: max-age=0 * ... * 該函數目的就是為了獲取/index.html字符串 */ private String parseUri(String requestString) { int index1, index2; index1 = requestString.indexOf(' '); if (index1 != -1) {  index2 = requestString.indexOf(' ', index1 + 1);  if (index2 > index1)  return requestString.substring(index1 + 1, index2); } return null; } public String getUri() { return uri; }}

Response類:

 package ex01.pyrmont;import java.io.OutputStream;import java.io.IOException;import java.io.FileInputStream;import java.io.File;/* HTTP Response = Status-Line *(( general-header | response-header | entity-header ) CRLF) CRLF [ message-body ] Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF*/public class Response { private static final int BUFFER_SIZE = 1024; Request request; OutputStream output; public Response(OutputStream output) { this.output = output; } public void setRequest(Request request) { this.request = request; } public void sendStaticResource() throws IOException { byte[] bytes = new byte[BUFFER_SIZE]; FileInputStream fis = null; try {  //將web文件寫入到OutputStream字節流中  File file = new File(HttpServer.WEB_ROOT, request.getUri());  if (file.exists()) {  fis = new FileInputStream(file);  int ch = fis.read(bytes, 0, BUFFER_SIZE);  while (ch != -1) {   output.write(bytes, 0, ch);   ch = fis.read(bytes, 0, BUFFER_SIZE);  }  } else {  // file not found  String errorMessage = "HTTP/1.1 404 File Not Found/r/n" + "Content-Type: text/html/r/n"   + "Content-Length: 23/r/n" + "/r/n" + "<h1>File Not Found</h1>";  output.write(errorMessage.getBytes());  } } catch (Exception e) {  // thrown if cannot instantiate a File object  System.out.println(e.toString()); } finally {  if (fis != null)  fis.close(); } }}

三、結果測試

訪問存在的資源文件(注意存放在工程目錄的webroot文件夾里):

訪問不存在的資源文件:

關閉服務器:

參考資料:《深入剖析Tomcat》

@author   風一樣的碼農

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大港区| 天长市| 金乡县| 江西省| 寻甸| 景宁| 古丈县| 银川市| 南澳县| 临澧县| 临泽县| 阜新市| 永春县| 长兴县| 淮阳县| 洪洞县| 石泉县| 新蔡县| 泌阳县| 平昌县| 陆川县| 福建省| 元朗区| 武汉市| 手游| 长武县| 巴林左旗| 保山市| 阿勒泰市| 原阳县| 绵竹市| 无为县| 平潭县| 北票市| 通道| 深州市| 青阳县| 镇远县| 石阡县| 务川| 务川|