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

netty之NettyClient半包粘包处理、编码解码处理、收发数据方式

前言


Netty开发中,客户端与服务端需要保持同样的;半包粘包处理,编码解码处理、收发数据方式,这样才能保证数据通信正常。在前面NettyServer的章节中我们也同样处理了;半包粘包、编码解码等,为此在本章节我们可以把这些知识模块开发到NettyClient中。本章节涉及到的知识点有;LineBasedFrameDecoder、StringDecoder、StringEncoder、ChannelInboundHandlerAdapter等
在这里插入图片描述
MyChannelInitializer

public class MyChannelInitializer extends ChannelInitializer<SocketChannel> {@Overrideprotected void initChannel(SocketChannel channel) throws Exception {// 基于换行符号channel.pipeline().addLast(new LineBasedFrameDecoder(1024));// 解码转String,注意调整自己的编码格式GBK、UTF-8channel.pipeline().addLast(new StringDecoder(Charset.forName("GBK")));// 解码转String,注意调整自己的编码格式GBK、UTF-8channel.pipeline().addLast(new StringEncoder(Charset.forName("GBK")));// 在管道中添加我们自己的接收数据实现方法channel.pipeline().addLast(new MyClientHandler());}}
public class MyClientHandler extends ChannelInboundHandlerAdapter {/*** 当客户端主动链接服务端的链接后,这个通道就是活跃的了。也就是客户端与服务端建立了通信通道并且可以传输数据*/@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {SocketChannel channel = (SocketChannel) ctx.channel();System.out.println("链接报告开始");System.out.println("链接报告信息:本客户端链接到服务端。channelId:" + channel.id());System.out.println("链接报告IP:" + channel.localAddress().getHostString());System.out.println("链接报告Port:" + channel.localAddress().getPort());System.out.println("链接报告完毕");//通知客户端链接建立成功String str = "通知服务端链接建立成功" + " " + new Date() + " " + channel.localAddress().getHostString() + "\r\n";ctx.writeAndFlush(str);}/*** 当客户端主动断开服务端的链接后,这个通道就是不活跃的。也就是说客户端与服务端的关闭了通信通道并且不可以传输数据*/@Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {System.out.println("断开链接" + ctx.channel().localAddress().toString());}@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {//接收msg消息{与上一章节相比,此处已经不需要自己进行解码}System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 接收到消息:" + msg);//通知客户端链消息发送成功String str = "客户端收到:" + new Date() + " " + msg + "\r\n";ctx.writeAndFlush(str);}/*** 抓住异常,当发生异常的时候,可以做一些相应的处理,比如打印日志、关闭链接*/@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {ctx.close();System.out.println("异常信息:\r\n" + cause.getMessage());}
}
public class NettyClient {public static void main(String[] args) {new NettyClient().connect("127.0.0.1", 7397);}private void connect(String inetHost, int inetPort) {EventLoopGroup workerGroup = new NioEventLoopGroup();try {Bootstrap b = new Bootstrap();b.group(workerGroup);b.channel(NioSocketChannel.class);b.option(ChannelOption.AUTO_READ, true);b.handler(new MyChannelInitializer());ChannelFuture f = b.connect(inetHost, inetPort).sync();System.out.println("client start done. {关注明哥,获取源码}");f.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {workerGroup.shutdownGracefully();}}}

启动客户端NettyClient进行测试即可
好了到这里就结束了netty之NettyClient半包粘包处理、编码解码处理、收发数据方式的学习,大家一定要跟着动手操作起来。需要的源码的 可si我获取;

http://www.lryc.cn/news/452442.html

相关文章:

  • Linux:文件描述符介绍
  • stm32f103调试,程序与定时器同步设置
  • 《Python编程:从入门到实践》数据可视化
  • github/git密钥配置与使用
  • BiLSTM模型实现电力数据预测
  • VMware ESXi 6.7U3u macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025
  • 一个简单的SQL面试题
  • 网站服务器在不同操作系统上监听端口情况的方法
  • RabbitMQ篇(基本介绍)
  • 浅谈网络通信中的透传和非透传
  • 影视cms泛目录用什么程序?苹果cms二次开发泛目录插件
  • IP6537_C_30W20V--移动设备快充的得力助手,集成 14 种快充协议的降压 SoC
  • 【hot100-java】【寻找两个正序数组的中位数】
  • C++七种异常处理
  • 【C语言系统编程】【第三部分:网络编程】3.3 实践与案例分析
  • Unity3D播放GIF图片 插件播放
  • 基于STM32的远程工业控制系统架构设计:MQTT通信、React界面与FreeRTOS优化的综合应用
  • 墙绘艺术在线交易平台:SpringBoot技术详解
  • VMware中Ubuntu系统Docker正常运行但网络不通(已解决)
  • 【web安全】——文件包含漏洞
  • 游戏如何对抗改包
  • 12.梯度下降法的具体解析——举足轻重的模型优化算法
  • GPT对话知识库——C、C++,还有Java,他们之间有什么区别
  • 华为GaussDB数据库之Yukon安装与使用
  • Linux命令:用于显示 Linux 发行版信息的命令行工具lsb_release详解
  • sbb-classes 元素
  • (作业)第三期书生·浦语大模型实战营(十一卷王场)--书生入门岛通关第3关Git 基础知识
  • 12.数据结构和算法-栈和队列的定义和特点
  • 15分钟学 Python 第34天 :小项目-个人博客网站
  • 从零开始实现RPC框架---------项目介绍及环境准备