1. 程式人生 > >Java實現簡易Tomcat伺服器(清晰易懂)

Java實現簡易Tomcat伺服器(清晰易懂)

Tomcat伺服器是一個輕量級的Java程式碼實現的WEB伺服器。這篇文章將會講述如何用Java實現一個簡易版的Tomcat伺服器。

簡單的講,簡易原理是這樣的:

1. Tomcat開始執行之後,會在主機上開一個埠(預設是80埠),在所開闢的埠上執行一個ServerSocket,執行accept()方法等待瀏覽器訪問。

2. 瀏覽器訪問目標主機的80埠,ServerSocket的accept()方法返回一個執行在伺服器端的socket,該socket有getInputStream()方法和getOutputStream方法,可以獲得瀏覽器對伺服器傳送的內容和響應瀏覽器併發送內容。

3. 瀏覽器收到伺服器響應的內容,通過瀏覽器解釋,內容顯示在使用者眼前。

注意:

1. 瀏覽器傳送給伺服器的訪問請求符合HTTP協議。

2. 瀏覽器可以像伺服器請求一個HTML頁面,也可以請求圖片,若HTML頁面中匯入了圖片或者css,js,則這些內容也會像伺服器請求,伺服器會根據檔名,對瀏覽器進行響應,若該檔案在伺服器目錄中找不到,則返回404錯誤。

3. 本簡易Tomcat伺服器只適用於靜態資源。

4. 本簡易Tomcat分為兩個類,Server類以及Handler類,Server類接收請求,然後建立子執行緒,到Handler類中去處理瀏覽器傳送的請求,並反饋。

程式碼及註釋如下:

package com.yykj;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        Server server = new Server();
        server.startServer();
    }
    public  void startServer(){
        try {
            ServerSocket serverSocket = new ServerSocket(80);//開啟80埠
            System.out.println("伺服器啟動>>> 80埠");
            while(true){//開啟一個永遠的迴圈,一直等待客戶訪問80埠
                Socket socket = serverSocket.accept();
                Thread thread = new Thread(new Handler(socket));//當有客戶訪問時,開闢一個新執行緒處理該請求
                System.out.println("收到新請求");
                thread.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Handler類:

package com.yykj;

import java.io.*;
import java.net.Socket;

//請求處理程式
public class Handler implements  Runnable {

    private Socket socket;
    private OutputStream outputStream;
    private InputStream inputStream;
    private BufferedReader reader;
    private PrintWriter writer;
    private static String WEB_ROOT = "C:\\Users\\Administrator\\Desktop\\web";//伺服器儲存檔案目錄
    public Handler(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run(){
        try{
            inputStream = socket.getInputStream();//伺服器到客戶的輸出流
            outputStream = socket.getOutputStream();//客戶到伺服器的輸入流
            reader = new BufferedReader(new InputStreamReader(inputStream));//包裝後的輸入緩衝字元流
            writer = new PrintWriter(new OutputStreamWriter(outputStream));//包裝後的輸出緩衝字元流
            String msg;//接收客戶端請求的臨時字串
            StringBuffer request = new StringBuffer();//將請求拼接成完整的請求
            while((msg = reader.readLine()) != null && msg.length() > 0){
                request.append(msg);
                request.append("\n");//HTTP協議的格式
            }
            String[] msgs = request.toString().split(" ");//HTTP協議以空格為分隔符
            //msgs[1]代表了HTTP協議中的第二個字串,是瀏覽器請求的檔名
/*            if(msgs[1].endsWith(".ico")){//.ico檔案是瀏覽器頁面的圖示檔案,是瀏覽器預設會向伺服器傳送的請求
                writer.println("HTTP/1.1 200 OK");//如果伺服器不打算對客戶端傳送.ico結尾的檔案,可以這一寫,然後直接返回,跳過傳送該檔案的過程
                writer.println("Content-Type: text/html;charset=UTF-8");
                writer.close();
                //如果不傳送,就直接返回
                return;
            }*/
            //將伺服器目錄下被請求的檔案讀入程式
            FileInputStream fileInputStream = new FileInputStream(new File(WEB_ROOT + msgs[1]));
            byte[] fileBuffer = new byte[1024];//可能是二進位制檔案,所以需要用byte陣列做緩衝
            int length = 0;
            while((length = fileInputStream.read(fileBuffer)) != -1){
                outputStream.write(fileBuffer, 0, length);//向客戶端瀏覽器傳送檔案
            }
            outputStream.close();
            inputStream.close();
            reader.close();
            fileInputStream.close();
        }catch (IOException e){
            //如果丟擲異常,在這裡基本上是未找到被請求檔案,所以返回404
            writer.write("HTTP/1.1 404 ERROR:FILE NOT FINDED");
            writer.close();
        }
    }
}

相關推薦

Java實現簡易Tomcat伺服器清晰易懂

Tomcat伺服器是一個輕量級的Java程式碼實現的WEB伺服器。這篇文章將會講述如何用Java實現一個簡易版的Tomcat伺服器。 簡單的講,簡易原理是這樣的: 1. Tomcat開始執行之後,會在主機上開一個埠(預設是80埠),在所開闢的埠上執行一個ServerSock

JAVA實現簡易HTTP伺服器

說實話,之前完全沒有想過,我還能寫出伺服器。感覺伺服器這麼高階的東西,能會用就不錯了,還能寫。 不吐槽了,開始了。 這次的作業是搭建一個伺服器,要能接收請求,並給瀏覽器返回正確響應。 專案的下載地址 專案目標:實現一個簡易的多執行

使用java實現郵件傳送功能已封裝

現如今,用郵件傳送訊息的人越來越少,可是並不影響我們學習java。 以下給大家帶來自己寫的封裝類,可以直接使用。 首先,需要jar包: 普通javaweb專案:mail.jar maven管理專案:  <dependency>     &

Java實現簡訊驗證碼--完整教程

        我們在實現登入註冊的時候,常常用到了簡訊驗證碼校驗,下面給大家簡單介紹阿里雲的簡訊服務平臺。        相關jar包:        aliyun-java-sdk-core-3.2.2.jar(點此下載)        aliyun-java-sdk-d

java 實現陣列去重集合轉換

public static void main(String[] args) { int[] nums = { 5, 6, 6, 6, 8, 8, 7 }; List<Integer> numList = new ArrayList<Integer

利用xinetd實現簡單web伺服器映象站

瀏覽效果: linux伺服器安裝xinetd後,在/etc/xinetd.d/目錄下建立xhttpd檔案,並輸入內容: service xhttpd { socket_type = stream protocol = tcp wait = no

java實現匯出word功能包含圖片

一、目的         這個功能已經完成很久了,一直沒有想起來去整理成文,今天就把它整理出來,供大家參考和批評。這個匯出功能也研究了好幾天,同時也看了很多人寫的部落格,真的是千篇一律,好多都不是我想要的功能,為什麼要做匯出word呢,肯定是工作需要了,是將公司的博文匯出來

Java 實現人臉識別功能附原始碼

![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200306184837536.png) > 整理了一些Java方面的架構、面試資料(微服務、叢集、分散式、中介軟體等),有需要的小夥伴可以關注公眾號【程式設計師內點事】,無套路自行領取 更多優選 - [一口氣說

【轉載】Java動態代理之JDK實現和CGlib實現簡單易懂

      原文地址:http://www.cnblogs.com/ygj0930/p/6542259.html       一:代理模式(靜態代理)           代理模式是常用設計模式的一種,我們在軟體設計時常用的代理一般是指靜態代理,也就是在程式碼中顯式指定的

Android手機客戶端通過JSP實現Tomcat伺服器端通訊Msql資料庫,Json作為載體--服務端程式碼

伺服器端主要程式碼: 1.首先構建一個Person類,用來儲存使用者資訊 public class Person private String name; private String address; private Integer age; public P

java web專案部署到tomcat伺服器一般步驟和自己所犯錯誤的總結————高手忽略

最近由於專案需求,需要將java web專案部署到本地tomcat上(版本為8.0)進行測試。作為一個非計算機專業的菜鳥,之前的工作都是寫後臺邏輯程式碼,沒接觸過web專案部署。部署的時候不知道如何下手,參考了其他部落格以及他人問題的解決方法,終於把專案簡單部署到tomca

Java動態代理之JDK實現和CGlib實現簡單易懂

原文地址:http://www.cnblogs.com/ygj0930/p/6542259.html 一:代理模式(靜態代理)           代理模式是常用設計模式的一種,我們在軟體設計時常用的代理一般是指靜態代理,也就是在程式碼中顯式指定的代理。      

Java實現二叉樹遞迴非遞迴前序中序後序遍歷通俗易懂

想要弄懂Java的一個知識點,沒有比親自手寫一遍更好的方法 仔細研究手寫一遍,一定會收穫滿滿,沒有你想想中那麼難  小編下面以這個二叉樹為例,測試程式碼 以下是完整的四個類程式碼,大家可先放在自己本地IDE上除錯檢視,更加清晰 我們需要先將二叉樹構建出來,然後

java程式碼例項 使用switch實現簡易的計算器實現加減乘除)

import java.util.Scanner; /* * 使用switch實現簡易的計算器(實現加減乘除); */ public class test { public static v

libwebsockets實現簡易websocket伺服器

實現websocket伺服器本身也是libwebsockets庫的初衷,本篇部落格將介紹如何利用libwebsockets庫來實現一個簡單的ws伺服器。 1、新增websocket協議 這裡建立伺服器控制代碼的流程與http一致,需要修改的地方只有在建立

java搭建阿里雲伺服器環境java環境+mysql+tomcat和部署 JavaWeb 專案到雲伺服器十分詳細

文章有不當之處,歡迎指正,如果喜歡微信閱讀,你也可以關注我的微信公眾號:好好學java,獲取優質學習資源。購買一系列的東西其實就是花錢買塊區域,伺服器,域名,雲解析,花了好多money。。。一、租伺服器百度搜索阿里雲進入官網首頁,點選登入進入登入頁面,可以使用郵箱登入或者註冊

手寫實現java棧結構,並實現簡易的計算器基於字尾演算法

   一、定義   棧是一種線性表結構,棧結構中有兩端,對棧的操作都是對棧的一端進行操作的,那麼被操作的一端稱為棧頂,另一端則為棧底。對棧的操作其實就是隻有兩種,分別是入棧(也稱為壓棧)和出棧(也稱為彈棧)。入棧,將新元素壓入棧中,那麼此時這個棧元素就成為了棧頂元素,棧深度相應的+1。出棧,將棧中的

JAVA實現EXCEL公式專題——字符串函數

main 問題 int start boolean java ... ringbuf out substring 直接上代碼:/** * 項目名稱: * 文件說明: ExCEL公式類型:字符串公式 * 主要特點: * 版本:1.0 * 制作人:劉晨曦

JAVA實現EXCEL公式專題——統計函數

length trace trac 復雜 manage 排列 public ram script 統計函數主要實現的是較為復雜的統計函數如countif、sumif、frequency,也是,直接上代碼/** * 項目名稱: * 文件說明: * 主要特點

java 實現HTTP連接HTTPClient

ons urlencode arraylist col response str exec utils default   在實習中,使用到了http連接,一直理解的很模糊,特地寫個分析整理篇。分析不到位的地方請多多指教。   Http 目前通用版本為 http 1.1 。