当前位置: 首页 > news >正文

Netty服务端接收TCP链接数据

注:使用netty之前,需要先引入netty包,不同的框架,引入netty包的方式不同

1.定义NettyServer类

用于初始化netty连接

public class NettyServer {public void start() throws Exception {System.out.println("启动记载netty");EventLoopGroup boosGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();ServerBootstrap serverBootstrap = new ServerBootstrap(); // 引导类ServerBootstrap,这个类将引导服务端的启动工作serverBootstrap.group(boosGroup, workerGroup) // .group(bossGroup,workerGroup)给引导类配置两大线程组.channel(NioServerSocketChannel.class) // 指定服务端的IO模型为NIO NioServerSocketChannel是对NIO类型连接的抽象.option(ChannelOption.SO_BACKLOG, 1024) // 表示系统用于临时存放已完成三次握手的请求的队列的最大长度.childOption(ChannelOption.SO_KEEPALIVE, true) // 表示是否开启TCP底层心跳机制,true表示开启。.childOption(ChannelOption.TCP_NODELAY, true) // 表示是否开启Nagle算法,true表示关闭,false表示开启.handler(new ChannelInitializer<NioServerSocketChannel>() { // handler()方法用于指定在服务端启动过程中的一些逻辑@Overrideprotected void initChannel(NioServerSocketChannel ch) {System.out.println("服务端启动过程中...");}}).childHandler(new ChannelInitializer<NioSocketChannel>() { // childHandler()方法,给这个引导类创建一个ChannelInitializer,主要是定义后续每个连接的数据读写protected void initChannel(NioSocketChannel ch) { // 泛型参数NioSocketChannel,这个类就是Netty对NIO类型连接的抽象ch.pipeline().addLast(new IdleStateHandler(0, 0, 15));//检测读写空闲事件,需要就开启,不需要就关闭ch.pipeline().addLast(new EchoServerHandler());}});System.out.println("启动加载netty2");// 给这个ChannelFuture添加一个监听器GenericFutureListenerserverBootstrap.bind(9997).addListener(future -> {if (future.isSuccess()) {System.out.println(new Date() + ": 端口[" + 9997 + "]绑定成功!");} else {System.err.println("端口[" + 9997 + "]绑定失败!");}});}
}

2.编写EchoServerHandler

用于netty接收到数据后处理数据

public class EchoServerHandler extends ChannelInboundHandlerAdapter {/*** 读取客户端发送过来的数据* @param ctx 上下文对象* @param msg 客户端发送的数据* @throws Exception*/@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg){ByteBuf byteBuf= (ByteBuf) msg;String req=byteBuf.toString(CharsetUtil.UTF_8);System.out.println("接收到客户端请求:"+req);System.out.println("客户端地址: " + ctx.channel().remoteAddress());/**String res= "服务器响应["+ LocalDateTime.now().format(DateTimeFormatter.ISO_DATE)+" "+LocalDateTime.now().format(DateTimeFormatter.ISO_TIME)+"]:"+req;System.out.println("服务端响应:"+res);**/}/*** 数据读取完毕* @param ctx* @throws Exception*/@Overridepublic void channelReadComplete(ChannelHandlerContext ctx){ctx.writeAndFlush(Unpooled.copiedBuffer("服务器响应[收到消息,谢谢]",CharsetUtil.UTF_8));}/*** 处理异常, 一般是需要关闭通道* @param ctx* @param cause* @throws Exception*/@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause){cause.printStackTrace();ctx.close();}@Overridepublic void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {if (evt instanceof IdleStateEvent) {IdleStateEvent event = (IdleStateEvent) evt;if (event.state() == IdleState.WRITER_IDLE) {ctx.channel().writeAndFlush("Heartbeat" + System.getProperty("line.separator"));}else if(event.state() == IdleState.ALL_IDLE){//如果长时间空闲,则关闭链接System.out.println("链接长时间没有数据,关闭连接");ctx.channel().close();}}}
}

3.使用netty

public class Main {public static void main(String[] args) {NettyServer server = new NettyServer();try{server.start();}catch (Exception e) {throw new RuntimeException(e);}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 代码随想录算法训练营:28/60
  • JAVA中关于compareTo方法的原理深挖
  • 【论文阅读】AsyncDiff: Parallelizing Diffusion Models by Asynchronous Denoising
  • VS2019 因公司加密无法运行程序原因
  • 树莓派4B_OpenCv学习笔记21:OpenCV_haar人脸识别
  • Day1--每日一练
  • P8086 『JROI-5』Music
  • 深入理解外观模式(Facade Pattern)及其实际应用
  • 网络钓鱼中的高级同形异义:网络安全的新威胁
  • 【前端】css控制背景图片缩放
  • C++list的模拟实现
  • 【Python123题库】#统计单词的数量 #各位数字之和为5的数 #输出单词
  • qt 按钮链接一个槽函数
  • 昇思25天学习打卡营第十六天|基于MindSpore的GPT2文本摘要
  • 操作系统---进程的同步和互斥(易错知识点梳理)
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • 5、React组件事件详解
  • Angularjs之国际化
  • es6要点
  • Redis中的lru算法实现
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 基于webpack 的 vue 多页架构
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 在Docker Swarm上部署Apache Storm:第1部分
  • puppet连载22:define用法
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #if和#ifdef区别
  • #Linux(Source Insight安装及工程建立)
  • #mysql 8.0 踩坑日记
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (二)JAVA使用POI操作excel
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (四)opengl函数加载和错误处理
  • (推荐)叮当——中文语音对话机器人
  • (原)Matlab的svmtrain和svmclassify
  • .NET C# 操作Neo4j图数据库
  • .NET Core 成都线下面基会拉开序幕
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET6 命令行启动及发布单个Exe文件
  • .net后端程序发布到nignx上,通过nginx访问
  • .net流程开发平台的一些难点(1)
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • @AliasFor 使用
  • @Controller和@RestController的区别?
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [android] 切换界面的通用处理
  • [ARM]ldr 和 adr 伪指令的区别
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [C][数据结构][树]详细讲解
  • [CTF夺旗赛] CTFshow Web1-12 详细过程保姆级教程~