基于 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.mzph.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一、基础检查二、网络层分析三、…