基于 Netty 框架的 Java TCP 服務器端實現,用于啟動一個 TCP 服務器來處理客戶端的連接和數據傳輸

代碼:

package com.example.tpson_tcp;import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;/*** Netty服務端類,用于啟動TCP服務器。*/
@Service
public class NettyServer {/*** 在對象初始化后自動調用的方法,用于啟動服務器。* 無參數和返回值。*/@PostConstructpublic void main() {// 創建EventLoopGroup用于處理網絡事件EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();try {// 配置服務器啟動參數ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) // 指定使用的NIO通道類.childHandler(new ChannelInitializer<SocketChannel>() { // 設置通道初始化處理器@Overrideprotected void initChannel(SocketChannel ch) throws Exception {// 在通道中添加處理鏈,用于解碼、編碼和處理設備數據ch.pipeline().addLast(new StringDecoder());ch.pipeline().addLast(new StringEncoder());ch.pipeline().addLast(new DeviceDataHandler());}}).option(ChannelOption.SO_BACKLOG, 128) // 設置連接隊列大小.childOption(ChannelOption.SO_KEEPALIVE, true); // 啟用TCP KeepAlive// 綁定端口并啟動服務器ChannelFuture channelFuture = serverBootstrap.bind(8092).sync();// 等待服務器關閉channelFuture.channel().closeFuture().sync();} catch (InterruptedException e) {// 異常處理,拋出運行時異常throw new RuntimeException(e);} finally {// 關閉EventLoopGroup,釋放資源workerGroup.shutdownGracefully();bossGroup.shutdownGracefully();}}
}

代碼解釋:

1. 包導入部分

java

package com.example.tpson_tcp;import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
  • package com.example.tpson_tcp;:指定該類所屬的包名。
  • 后續一系列?import?語句引入了 Netty 框架的相關類,用于網絡編程。ServerBootstrap?用于配置和啟動服務器;EventLoopGroup?是用于處理網絡事件的線程池;StringDecoder?和?StringEncoder?用于對字符串進行編解碼。
  • org.springframework.stereotype.Service?表明這是一個 Spring 服務類。
  • javax.annotation.PostConstruct?用于標記一個方法,該方法會在對象初始化后自動調用。

2. 類定義和注解

java

  • @Service:這是 Spring 框架的注解,將?NettyServer?類標記為一個服務組件,Spring 會自動掃描并管理這個類的實例。
  • public class NettyServer:定義了一個名為?NettyServer?的公共類。

3.?main?方法

java

@PostConstruct
public void main() {
  • @PostConstruct:該注解表明?main?方法會在?NettyServer?類的實例被創建并初始化后自動調用。
  • public void main():定義了一個公共的無返回值方法?main

4. 創建?EventLoopGroup

java

EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();

  • NioEventLoopGroup?是 Netty 提供的基于 Java NIO 的事件循環組,用于處理網絡事件。
  • bossGroup?主要負責接受客戶端的連接請求。
  • workerGroup?負責處理已經建立的連接的讀寫操作。

5. 配置服務器啟動參數

java

ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Overrideprotected void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new StringDecoder());ch.pipeline().addLast(new StringEncoder());ch.pipeline().addLast(new DeviceDataHandler());}}).option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true); 

  • ServerBootstrap?用于配置和啟動服務器。
  • group(bossGroup, workerGroup):指定使用的?EventLoopGroup
  • channel(NioServerSocketChannel.class):指定使用的 NIO 通道類,用于接受客戶端的連接。
  • childHandler:設置通道初始化處理器,當有新的連接建立時,會調用?initChannel?方法。在該方法中,向通道的處理鏈中添加了?StringDecoderStringEncoder?和?DeviceDataHandlerStringDecoder?用于將接收到的字節數據解碼為字符串,StringEncoder?用于將字符串編碼為字節數據發送出去,DeviceDataHandler?用于處理具體的業務邏輯。
  • option(ChannelOption.SO_BACKLOG, 128):設置連接隊列的大小,即允許等待處理的最大連接數。
  • childOption(ChannelOption.SO_KEEPALIVE, true):啟用 TCP 的 KeepAlive 機制,用于檢測長時間空閑的連接是否仍然有效。

6. 綁定端口并啟動服務器

java

ChannelFuture channelFuture = serverBootstrap.bind(8092).sync();
channelFuture.channel().closeFuture().sync();
  • serverBootstrap.bind(8092):將服務器綁定到指定的端口 8092。
  • sync()?方法是一個同步方法,會阻塞當前線程,直到綁定操作完成。
  • channelFuture.channel().closeFuture().sync():等待服務器關閉,會阻塞當前線程,直到服務器的通道關閉。

7. 異常處理和資源釋放

java

} catch (InterruptedException e) {throw new RuntimeException(e);
} finally {workerGroup.shutdownGracefully();bossGroup.shutdownGracefully();
}
  • catch (InterruptedException e):捕獲?InterruptedException?異常,當線程在等待過程中被中斷時會拋出該異常,將其包裝成?RuntimeException?重新拋出。
  • finally?塊:無論是否發生異常,都會執行該塊中的代碼,調用?shutdownGracefully()?方法來優雅地關閉?workerGroup?和?bossGroup,釋放資源。

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

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

相關文章

深入解析原生鴻蒙中的 RN 日志系統:從入門到精通!

全文目錄&#xff1a; 開篇語&#x1f4d6; 目錄&#x1f3af; 前言&#xff1a;鴻蒙日志系統究竟有多重要&#xff1f;&#x1f6e0;? 鴻蒙 RN 日志系統的基礎結構&#x1f4dc; 1. 日志的作用?? 2. 日志分類 &#x1f527; 如何在鴻蒙 RN 中使用日志系統&#x1f58b;? 1…

算法訓練營Day01(二分 雙指針)

704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; 關于二分查找 最重要的是要處理好邊界問題&#xff0c;每次寫完邊界可以帶入特殊值進行測試確定區間的不變量是什么&#xff1f;比如區間的左閉右閉&#xff0c;和左閉右開&#xff0c;每次二分完的新區間&#xff0c;一…

shadcn 使用步驟與注意點

目錄 一、shadcn ui 二、使用流程 1.安裝 2.顏色與主題 3.引用blocks 三、使用注意點 四、推薦搭配工具 五、總結 一、shadcn ui 官網&#xff1a;Build your component library - shadcn/ui 為何選擇它&#xff1f;因為它是一個基于 Tailwind CSS Radix UI 的組件集…

STM32CubeMX-H7-12-IIC讀寫MPU6050模塊(中)-MPU6050模塊詳解以及軟件IIC驅動

前言 上一篇我們已經完成對IIC代碼基本框架的編寫&#xff0c;以及獲取MPU6050的ID&#xff0c;接下來我們逐一分析這個模塊的功能&#xff0c;并用IIC驅動 建議看完上一篇再來看這篇 MPU6050寄存器介紹 1.電源管理寄存器&#xff08;PWR_MGMT_1&#xff0c;地址&#xff1a;0…

量子計算模擬中的GPU加速:從量子門操作到Shor算法實現

一、量子模擬的算力困境與GPU破局 量子計算模擬面臨?指數級增長的資源需求?&#xff1a;n個量子比特的態向量需要2^n個復數存儲空間。當n>30時&#xff0c;單機內存已無法承載&#xff08;1TB需求&#xff09;。傳統CPU模擬器&#xff08;如Qiskit的Aer&#xff09;在n28…

spring mvc 異常處理中@RestControllerAdvice 和 @ControllerAdvice 對比詳解

RestControllerAdvice 和 ControllerAdvice 對比詳解 1. 基本概念 注解等效組合核心作用ControllerAdviceComponent RequestMapping&#xff08;隱式&#xff09;定義全局控制器增強類&#xff0c;處理跨控制器的異常、數據綁定或全局響應邏輯。RestControllerAdviceControll…

JavaScript的回調函數:異步編程的基石

引言 在JavaScript的世界里&#xff0c;回調函數是一種強大而基礎的編程模式&#xff0c;它是異步編程的核心概念之一。隨著Web應用程序變得越來越復雜&#xff0c;理解和掌握回調函數變得尤為重要。本文將深入探討JavaScript回調函數的概念、應用場景以及最佳實踐。 什么是回…

測試用例 [軟件測試 基礎]

目錄 測試用例 1. 概念 1.1 什么是測試用例 1.2 什么是要素 1.3 為什么需要測試用例 2. 設計測試用例的萬能公式 2.1 常規思維 逆向思維 發散性思維 2.2 萬能公式 3. 設計測試用例的方法 3.1 基于需求的設計方法 3.2 具體的設計方法 3.3 更多用例練習 測試用例 …

Jupyter notebook定制字體

一、生成配置文件 運行Anaconda Powershell Prompt終端&#xff0c;輸入下面一行代碼&#xff1a; jupyter notebook --generate-config 將生成文件“C:\Users\XXX\.jupyter\jupyter_notebook_config.py”&#xff0c;XXX為計算機賬戶名字。 二、修改配置文件 c.NotebookAp…

miniconda安裝R語言圖文教程(詳細步驟)

本篇教程介紹,如何在Windows使用miniconda安裝R語言。 一、創建1個conda 虛擬環境 # 創建虛擬環境 conda create -n r_env # 激活虛擬環境 conda activate r_env二、安裝 R 語言 conda install -c r r-ggplot2三、運行測試 檢查安裝: 輸入 R 進入 R 的交互式命令行,檢查是…

【day1】AI軟件測試學習筆記

以下為整理的 AI軟件測試學習筆記&#xff0c;涵蓋性能測試工具鏈、AI大模型應用及開發實踐&#xff0c;分為四大模塊&#xff1a; 一、性能測試工具鏈與數據分析 1. 工具鏈整合效果 JMeter InfluxDB Grafana JMeter壓測數據存儲至云端InfluxDB&#xff0c;實現分布式壓測和…

WPF 資源加載問題:真是 XAML 的鍋嗎?

你的觀察很敏銳&#xff01;確實&#xff0c;在 WPF 項目中&#xff0c;.cs 文件主要負責邏輯實現&#xff0c;而資源加載的問題通常跟 XAML&#xff08;以及它背后的 .csproj 配置&#xff09;關系更大。我會圍繞這個觀點&#xff0c;用 CSDN 博客風格詳細解釋一下 .cs、XAML …

C++17模板編程與if constexpr深度解析

一、原理深化 1.1 模板編程 1.1.1 編譯器如何處理模板&#xff08;補充&#xff09; 模板的實例化機制存在兩種模式&#xff1a; 隱式實例化&#xff1a;編譯器在遇到模板具體使用時自動生成代碼&#xff0c;可能導致多翻譯單元重復實例化&#xff0c;增加編譯時間。顯式實…

408 計算機網絡 知識點記憶(6)

前言 本文基于王道考研課程與湖科大計算機網絡課程教學內容&#xff0c;系統梳理核心知識記憶點和框架&#xff0c;既為個人復習沉淀思考&#xff0c;亦希望能與同行者互助共進。&#xff08;PS&#xff1a;后續將持續迭代優化細節&#xff09; 往期內容 408 計算機網絡 知識…

MySQL學習筆記十四

第十六章創建高級聯結 16.1使用表別名 輸入&#xff1a; SELECT CONCAT(vend_name,(,RTRIM(vend_country),)) AS vend_title FROM vendors ORDER BY vend_name; 輸出&#xff1a; 輸入&#xff1a; SELECT cust_name, cust_contact FROM customers AS c, orders AS o, or…

Spring MVC 框架 的核心概念、組件關系及流程的詳細說明,并附表格總結

以下是 Spring MVC 框架 的核心概念、組件關系及流程的詳細說明&#xff0c;并附表格總結&#xff1a; 1. 核心理念 Spring MVC 是基于 MVC&#xff08;Model-View-Controller&#xff09;設計模式 的 Web 框架&#xff0c;其核心思想是 解耦&#xff1a; Model&#xff1a;數…

Android里藍牙使用流程以及問題詳解

一、基礎流程 請簡述 Android 藍牙開發的基本流程 1. 權限處理&#xff1a;動態申請藍牙和定位權限&#xff08;注意Android 12新權限&#xff09; 2. 初始化藍牙適配器&#xff1a;通過BluetoothManager獲取BluetoothAdapter 3. 設備發現&#xff1a;- 注冊BroadcastReceive…

OpenWrt 上安裝Tailscale

在 OpenWrt 上安裝 Tailscale 非常簡單&#xff0c;主要步驟如下&#xff1a; 1. 確保 OpenWrt 設備可聯網 首先&#xff0c;確保你的 OpenWrt 設備已經聯網&#xff0c;可以訪問外網&#xff0c;并且 SSH 進入你的路由器&#xff08;通常是 192.168.1.1&#xff09;&#xff…

藍橋杯刷題總結 + 應賽技巧

當各位小伙伴們看到這篇文章的時候想必藍橋杯也快開賽了&#xff0c;那么本篇文章博主就來總結一下一些藍橋杯的應賽技巧&#xff0c;那么依舊先來走個流程 那么接下來我們分成幾個板塊進行總結 首先是一些基本語法 編程語言的基本語法 首先是數組&#xff0c;在存數據的時候…

TCP重傳率高與傳輸延遲問題

目錄標題 排查步驟&#xff1a;TCP重傳率高與傳輸延遲問題v1.0通過 rate(node_netstat_Tcp_RetransSegs[3m]) 排查 TCP 重傳問題的步驟1. **指標含義與初步分析**2. **關聯指標排查**3. **定位具體問題源**4. **解決方案**5. **驗證與監控** v2.0一、基礎檢查二、網絡層分析三、…