如何用JAVA手寫一個Tomcat

一、初步理解Tomcat

Tomcat是什么?

Tomcat?是一個開源的?輕量級 Java Web 應用服務器,核心功能是?運行 Servlet/JSP

Tomcat的核心功能?

Servlet 容器:負責加載、實例化、調用和銷毀 Servlet。

HTTP 服務器:監聽端口(默認 8080),解析 HTTP 請求,封裝 HTTP 響應。

JSP 支持:將 JSP 文件編譯為 Servlet 執行。

線程池管理:并發處理多個請求,提高性能。

二、Servlet的原理

Servlet框架?

三、什么是socket?

Socket(套接字)是計算機網絡中用于進程間通信的核心技術,它允許不同主機或同一主機上的不同程序通過網絡交換數據

?Socket 是什么?

  • 定義:Socket 是操作系統提供的抽象接口,本質上是通信的端點(Endpoint)。它封裝了底層網絡協議(如TCP/IP或UDP)的復雜性,提供了一組簡單的API【API(Application Programming Interface,應用程序編程接口)?是軟件系統之間交互的橋梁,定義了如何請求服務、傳遞數據以及返回結果的規則。】供應用程序使用。

  • 關鍵要素

    • IP地址:標識網絡中的主機。

    • 端口號:標識主機上的具體服務(如HTTP默認80端口)。

    • 協議:如TCP(可靠連接)或UDP(無連接)。


端口是邏輯抽象概念,并非物理硬件。

端口是操作系統用來區分不同網絡服務的數字標識(范圍0~65535)。

網卡(硬件)負責收發數據,而端口由操作系統通過協議棧(如TCP/IP)管理。

Socket 是軟件技術,不是物理硬件。


Socket的作用

  • 跨網絡通信:使不同設備上的進程能夠交換數據(例如瀏覽器與服務器交互)。

  • 支持多種協議:可通過TCP、UDP等協議傳輸數據。

  • 雙向通信:建立連接后,雙方可同時發送和接收數據。

  • 靈活性:可用于構建各種網絡應用(如Web服務器、聊天軟件、文件傳輸等)。

為什么 Tomcat 需要 Socket??

Tomcat 是一個基于Java的Web服務器Servlet容器,其核心功能依賴Socket實現:

  1. HTTP請求處理

    • 當用戶訪問網站時,瀏覽器通過Socket(TCP連接)向Tomcat發送HTTP請求。

    • Tomcat監聽8080端口(默認),通過Socket接收請求數據,解析后交給Servlet處理。

    • 處理完成后,再通過Socket將HTTP響應返回給瀏覽器。

  2. 連接管理

    • Tomcat使用ServerSocket監聽端口,等待客戶端連接。

    • 每收到一個請求,Tomcat會創建一個新的Socket連接(或復用線程池中的連接)處理該請求,實現高并發。

  3. 協議支持

    • 除了HTTP/1.1(基于TCP Socket),Tomcat還支持HTTP/2、WebSocket等,這些協議最終都依賴Socket實現數據傳輸。

?Tomcat 中的 Socket 工作流程?

四、Tomcat框架及代碼

網卡上需要注冊端口號。

?通過searchClassUtil類能獲取類的全路徑------>>根據全路徑名生成類對象(反射)------>>獲取類信息


public class HttpServletRequest {private String method;private String url;//............public String getMethod() {return method;}public void setMethod(String method) {this.method = method;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}
}
public class HttpServletResponse {//輸出流private OutputStream outputStream;public HttpServletResponse(OutputStream outputStream){this.outputStream = outputStream;}/*** 返回動態資源* @param context*/public void write(String context) throws IOException {//System.out.println(context);outputStream.write(context.getBytes());}/*** 返回靜態資源*/public void writeHtml(String path) throws Exception {String resourcesPath = FileUtil.getResoucePath(path);File file = new File(resourcesPath);if(file.exists()){//靜態文件存在System.out.println("靜態文件存在");FileUtil.writeFile(file,outputStream);}else {System.out.println("靜態文件不存在");write(ResponseUtil.getResponseHeader404());}}}

/*** tomcat路由*/
public class TomcatRoute {public static HashMap<String, HttpServlet> routes = new HashMap<>();static {List<String> paths  = SearchClassUtil.searchClass();  //獲取全路徑名//根據全路徑名稱生成類對象for (String path: paths) {try {Class clazz = Class.forName(path);  //生成類對象WDServlet webServlet = (WDServlet) clazz.getDeclaredAnnotation(WDServlet.class);routes.put(webServlet.url(), (HttpServlet) clazz.getDeclaredConstructor().newInstance());} catch (Exception e) {e.printStackTrace();}}}}

public interface servlet {public void service(HttpServletRequest request, HttpServletResponse response) throws IOException;
}
public abstract class HttpServlet implements servlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {}public void doPost(HttpServletRequest request,HttpServletResponse response){}@Overridepublic void service(HttpServletRequest request, HttpServletResponse response) throws IOException {if(request.getMethod().equals("GET")){doGet(request,response);}else if(request.getMethod().equals("POST")){doPost(request,response);}}
}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface WDServlet {String url() default "";
}

@WDServlet(url = "/myServlet")
public class MyFirstServlet extends HttpServlet {@Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response) {super.doPost(request, response);}@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {System.out.println("Hello World");response.write(ResponseUtil.getResponseHeader200("hello world  hhhhh"));}
}

@WDServlet(url = "/insert")
public class InsertServlet extends HttpServlet {@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response)  throws IOException {System.out.println("我是insert......");}@Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response) {super.doPost(request, response);}
}
@WDServlet(url = "/delete")
public class DeleteServlet extends HttpServlet {@Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response) {super.doPost(request, response);}@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {super.doGet(request, response);}
}
/*** tomcat主啟動類*/
public class MyTomcat {static HashMap<String, HttpServlet> routes = TomcatRoute.routes; //tomcat路由\/*** 分發器*/public  void dispatch(HttpServletRequest request ,HttpServletResponse response) throws IOException {HttpServlet servlet = routes.get(request.getUrl());  //if(servlet!=null){ //說明請求的就是我們的servletservlet.service(request,response);}}/*** socket 啟動* @throws IOException*/public  void start() throws IOException {ServerSocket serverSocket = new ServerSocket(4700);  //1.指定監聽的端口號//2.對端口進行監聽while (true){Socket socket = serverSocket.accept();//阻塞監聽//3.打開輸入流,解析客戶端發來的內容InputStream inputStream = socket.getInputStream(); //輸入流HttpServletRequest request = new HttpServletRequest();BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));  //將字節流轉換成字符流String str = reader.readLine();request.setMethod(str.split("\\s")[0]);request.setUrl(str.split("\\s")[1]);//4.打開輸出流OutputStream outputStream = socket.getOutputStream();HttpServletResponse response = new HttpServletResponse(outputStream);dispatch(request,response);}}//socketpublic static void main(String[] args) throws IOException {MyTomcat myTomcat = new MyTomcat();myTomcat.start();}
}

?

?五、字節流、字符流

字節流:二進制;

字符流:各種字符

?

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/84105.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84105.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/84105.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

短劇系統開發與抖音生態融合:短視頻時代的新風口與商業機遇

在短視頻內容井噴的時代&#xff0c;“短劇”作為一種新興內容形態&#xff0c;正以驚人的速度搶占用戶注意力。抖音、快手等平臺日均播放量破億的短劇作品&#xff0c;不僅催生了新的內容創作風口&#xff0c;更推動了短劇系統開發的巨大市場需求。本文將深度解析短劇系統開發…

《云原生安全攻防》-- K8s日志審計:從攻擊溯源到安全實時告警

當K8s集群遭受入侵時&#xff0c;安全管理員可以通過審計日志進行攻擊溯源&#xff0c;通過分析攻擊痕跡&#xff0c;我們可以找到攻擊者的入侵行為&#xff0c;還原攻擊者的攻擊路徑&#xff0c;以便修復安全問題。 在本節課程中&#xff0c;我們將介紹如何配置K8s審計日志&am…

3dczml時間動態圖型場景

在cesium中我們了可以使用czml數據來生成可以隨時間變化而變化的物體. 首先導入czml數據 設置時間范圍 id: "point" //物體在什么時間范圍可用 availability:"2012-08-04T16:00:00Z/2012-08-04T16:05:00Z"position:{ //設置物體的起始時間 epoch:"…

超小多模態視覺語言模型MiniMind-V 訓練

簡述 MiniMind-V 是一個超適合初學者的項目&#xff0c;讓你用普通電腦就能訓一個能看圖說話的 AI。訓練過程就像教小孩&#xff1a;先準備好圖文材料&#xff08;數據集&#xff09;&#xff0c;教它基礎知識&#xff08;預訓練&#xff09;&#xff0c;再教具體技能&#xf…

01-jenkins學習之旅-window-下載-安裝-安裝后設置向導

1 jenkins簡介 百度百科介紹&#xff1a;Jenkins是一個開源軟件項目&#xff0c;是基于Java開發的一種持續集成工具&#xff0c;用于監控持續重復的工作&#xff0c;旨在提供一個開放易用的軟件平臺&#xff0c;使軟件項目可以進行持續集成。 [1] Jenkins官網地址 翻譯&…

VPLC (VPLCnext) K8S

前序 在接觸Virtual PLCnext Control的時候&#xff0c;我想過好幾次如何將它運行在k8s上&#xff0c;由于對k8s的熟悉程度不夠&#xff0c;跌跌撞撞嘗試了很久&#xff0c;終于把vPLC部署在單機版的k8s上了。&#xff08;此教程僅為demo階段&#xff0c;此教程僅為demo階段&a…

OPC Client第5講(wxwidgets):初始界面的事件處理;按照配置文件初始化界面的內容

接上一講&#xff0c;即實現下述界面的事件處理代碼&#xff1b;并且按照配置文件初始化界面的內容&#xff08;三、&#xff09; 事件處理的基礎知識&#xff0c;見下述鏈接五、 OPC Client第3講&#xff08;wxwidgets&#xff09;&#xff1a;wxFormBuilder&#xff1b;基礎…

從乳制品行業轉型看智能化升級新機遇——兼談R2AIN SUITE的賦能實踐

一、市場現狀&#xff1a;乳制品行業迎來智能化轉型關鍵期 中國乳制品行業在經歷高速增長與深度調整后&#xff0c;已進入以"安全、效率、創新"為核心的新發展階段。根據施耐德電氣白皮書數據顯示&#xff0c;2019年乳制品合格率達99.8%[1]&#xff0c;液態奶占據77…

[20250522]目前市場上主流AI開發板及算法盒子的芯片配置、架構及支持的AI推理框架的詳細梳理

目前市場上主流AI開發板及算法盒子的芯片配置、架構及支持的AI推理框架的詳細梳理

【Golang筆記03】error、panic、fatal錯誤處理學習筆記

Golang筆記&#xff1a;錯誤處理學習筆記 一、進階學習 1.1、錯誤&#xff08;異常處理&#xff09; Go語言中也有和Java中的異常處理相關的機制&#xff0c;不過&#xff0c;在Go里面不叫異常&#xff0c;而是叫做&#xff1a;錯誤。錯誤分為三類&#xff0c;分別是&#x…

Python可視化設計原則

在數據驅動的時代&#xff0c;可視化不僅是結果的呈現方式&#xff0c;更是數據故事的核心載體。Python憑借其豐富的生態庫&#xff08;Matplotlib/Seaborn/Plotly等&#xff09;&#xff0c;已成為數據可視化領域的主力工具。但工具只是起點&#xff0c;真正讓圖表產生價值的&…

??WPF入門與XAML基礎:從零開始構建你的第一個WPF應用?

從零開始構建你的第一個WPF應用? 1.什么是WPF&#xff1f;??2.開發環境搭建??2.1 安裝Visual Studio??2.2 創建第一個WPF項目?? 3. WPF項目結構解析????3.1 MainWindow.xaml??3.2 MainWindow.xaml.cs?? 4. XAML基礎語法??4.1 屬性賦值方式??4.2 命名空間&…

電子電氣架構 --- 下一代汽車電子電氣架構中的連接性

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 鈍感力的“鈍”,不是木訥、遲鈍,而是直面困境的韌勁和耐力,是面對外界噪音的通透淡然。 生活中有兩種人,一種人格外在意別人的眼光;另一種人無論…

學習日記-day13-5.22

完成目標&#xff1a; 知識點&#xff1a; 1.抽象注意事項 知識點 核心內容 重點 抽象類實例化限制 抽象類不能直接實例化對象&#xff0c;只能創建非抽象子類的對象 嘗試實例化抽象類會觸發編譯錯誤 抽象方法與抽象類關系 抽象類不一定包含抽象方法&#xff0c;但含…

華碩無畏Pro14 2025,打造舒適辦公新體驗

在快節奏、高效率的現代辦公環境中&#xff0c;一臺得心應手的筆記本無疑是每位職場人士的“第二大腦”與核心生產力工具。它不僅需要承載日常工作的繁雜事務&#xff0c;更要在關鍵時刻穩定輸出&#xff0c;助力我們從容應對各種挑戰。 洞悉此需求&#xff0c;華碩推出了全新…

重寫B站(網頁、后端、小程序)

1. 網頁端 1.1 框架 Vue ElementUI axios 1.2 框架搭建步驟 搭建Vue 1.3 配置文件 main.js import {createApp} from vue import ElementUi from element-plus import element-plus/dist/index.css; import axios from "axios"; import router from…

MySQL數據 在 磁盤上是什么樣子的

MySQL數據 在 磁盤上是什么樣子的&#xff0c;取決于所使用的存儲引擎。存儲于引擎 是作用在 表! 上的。 存儲引擎 百度百科是這樣定義存儲引擎的&#xff1a;MySQL 中的數據用各種不同的技術存儲在文件&#xff08;或者內存&#xff09;中&#xff0c;這些不同的技術以及配套…

MySQL的相關操作

目錄 一. 字符串函數 二. group by分組 2.1 作用 2.2 格式 2.3 舉例 三. order by排序 3.1 格式 3.2 舉例 四. limit 4.1 作用 4.2 舉例 五. having 5.1 作用 5.2 舉例 六. 正則表達式 七. 多表查詢 7.1 定義 7.2 子查詢 7.3 聯合查詢 縱向合并 7.4 交叉連…

網絡安全-等級保護(等保) 2-7-3 GB/T 25058—2019 第7章 安全設計與實施

############################################################################### 對于安全廠家而言&#xff0c;最關心的內容在本章節&#xff0c;根據已確定的安全總體方案&#xff0c;完成技術措施和管理措施的詳細設計和實施&#xff0c;包含具體的安全產品和管理要求。…

【Spring Boot】配置實戰指南:Properties與YML的深度對比與最佳實踐

目錄 1.前言 2.正文 2.1配置文件的格式 2.2properties 2.2.1基礎語法 2.2.2value讀取配置文件 2.2.3缺點 2.3yml 2.3.1基礎語法 2.3.2配置不同數據類型 2.3.3配置讀取 2.3.4配置對象和集合 2.3.5優缺點 2.4綜合練習&#xff1a;驗證碼案例 2.4.1分析需求 2.4.2…