小傅哥 | https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获。专注于原创专题案例编写,目前已完成的专题有;Netty4.x实战专题案例、用Java实现JVM、基于JavaAgent的全链路监控、手写RPC框架、架构设计专题案例、源码分析等。你用剑 、我用刀 ,好的代码都很烧,望你不吝出招!

一、前言介绍

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

二、开发环境

  1. jdk1.8【jdk1.7以下只能部分支持netty】
  2. Netty4.1.36.Final【netty3.x 4.x 5每次的变化较大,接口类名也随着变化】
  3. telnet 测试【可以现在你的win7机器上测试这个命令,用于链接到服务端的测试命令】

三、代码示例

itstack-demo-netty-1-08
└── src├── main│   └── java│       └── org.itstack.demo.netty.client│           ├── MyChannelInitializer.java│           ├── MyClientHandler.java│           └── NettyClient.java└── test└── java└── org.itstack.demo.netty.test└── ApiTest.java

MyChannelInitializer.java

/*** 虫洞栈:https://bugstack.cn* 公众号:bugstack虫洞栈  {获取学习源码}* Create by fuzhengwei on 2019*/
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());}}

MyClientHandler.java

/*** 虫洞栈:https://bugstack.cn* 公众号:bugstack虫洞栈  {获取学习源码}* Create by fuzhengwei on 2019*/
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() + "rn";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 + "rn";ctx.writeAndFlush(str);}/*** 抓住异常,当发生异常的时候,可以做一些相应的处理,比如打印日志、关闭链接*/@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {ctx.close();System.out.println("异常信息:rn" + cause.getMessage());}}

NettyClient.java

/*** 虫洞栈:https://bugstack.cn* 公众号:bugstack虫洞栈  {获取学习源码}* Create by fuzhengwei on 2019*/
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("itstack-demo-netty client start done. {关注公众号:bugstack虫洞栈,获取源码}");f.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {workerGroup.shutdownGracefully();}}}

四、测试结果

启动模拟器NetAssist 设置TCP Server

启动客户端NettyClient

执行结果

/*** 虫洞栈:https://bugstack.cn* 公众号:bugstack虫洞栈  {获取学习源码}* Create by fuzhengwei on 2019*/
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("itstack-demo-netty client start done. {关注公众号:bugstack虫洞栈,获取源码}");f.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {workerGroup.shutdownGracefully();}}}

netty 客户端断开 异常处理_netty案例,netty4.1基础入门篇八《NettyClient半包粘包处理》发数据方式》...相关推荐

  1. java用netty做tcpserver接收c++消息_netty案例,netty4.1基础入门篇四《NettyServer收发数据》...

    小傅哥 | https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获.专注于原创专题案例编写,目前已完成的专题有:Netty4.x实战专题案例.用Java实现JVM.基于Ja ...

  2. client netty 主动发数据_netty案例,netty4.1基础入门篇十一《netty udp通信方式案例Demo》...

    小傅哥 | https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获.专注于原创专题案例编写,目前已完成的专题有:Netty4.x实战专题案例.用Java实现JVM.基于Ja ...

  3. java netty教程_Netty学习教程之基础使用篇

    什么Netty? Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 也就是说,Nett ...

  4. netty半包粘包 处理_Java NIO 框架 Netty 之美:粘包与半包问题

    一.前言 Netty 是一个可以快速开发网络应用程序的 NIO 框架,它大大简化了 TCP 或者 UDP 服务器的网络编程.Netty 的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性 ...

  5. 18-ESP8266 SDK开发基础入门篇--TCP 服务器 RTOS版,串口透传,TCP客户端控制LED

    https://www.cnblogs.com/yangfengwu/p/11112015.html 先规定一下协议 aa 55 02 01 F1 4C 控制LED点亮  F1 4C为CRC高位和低位 ...

  6. netty半包粘包 处理_老王:Netty到底是个什么鬼?有没有简单的理解方式?

    前语:不要为了读文章而读文章,一定要带着问题来读文章,勤思考. 作者:lyowish    来源:http://1t.click/7RY # 从HTTP说起 有了Netty,你可以实现自己的HTTP服 ...

  7. 20-ESP8266 SDK开发基础入门篇--C# TCP客户端编写 , 加入数据通信

    https://www.cnblogs.com/yangfengwu/p/11192594.html 自行调整页面 连接上以后主动发个数据 namespace TCPClient {public pa ...

  8. 【深度学习时间序列预测案例】零基础入门经典深度学习时间序列预测项目实战(附代码+数据集+原理介绍)

  9. 〖Python零基础入门篇(64)〗- 小案例 - 猜拳游戏与数字猜猜猜

    订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我.推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量43 ...

最新文章

  1. 卧槽,分享一个Python学习神器
  2. 【2014】【辛星】【php】【秋季】【2】第一个php程序
  3. 【LeanEAP.NET】精益企业应用平台---源码Demo下载
  4. python读文件代码-简单了解Python读取大文件代码实例
  5. java 鼠标绘图,教您如何用JAVA程序实现鼠标绘图
  6. logging模块和包
  7. 谈论源码_为什么每个人都在谈论WebAssembly
  8. 校园网打开IEEE 显示未登录
  9. latex 导出的pdf生成书签 目录
  10. 北京市行政边界划分矢量图
  11. 使用 JavaScript 制作一个可以弹的吉他
  12. 2022 东北四省赛 VP记录/补题
  13. 如何发一条九宫格图片的朋友圈
  14. 最新微信小程序获取音频时长与实时获取播放进度
  15. 解决python关于UnicodeEncodeError: 'gbk' codec can't encode character '\xa3'报错的问题
  16. 黑得漂亮!SyScan360黑客大会展示17秒攻陷IE
  17. 001] 智能手机操作系统介绍
  18. Python 石墨烯边缘磁性Hatree_Fock计算
  19. 1688商品sku采集抓取实现方法
  20. nrm : 无法加载文件 C:\Users\XXX\AppData\Roaming\npm\nrm.ps1,因为在此系统上禁止运行脚本

热门文章

  1. 优化你的DiscuzNT3.0,让它跑起来(4)asp.net 缓存和死锁
  2. 限制 TEdit 只能接收 数字 输入...
  3. jquery插件之thickbox
  4. mysql中blog数据_zp blog
  5. wps出现安装installer_为什么不能安装WPS
  6. php过去mysql数据表是空_PHP向mysql中写数据,在phpmyadmin中为空,直接打印有数据?...
  7. 用C语言计算中位数 众数,统计学计算中位数与众数
  8. vant显示日期格式_Vue+Vant ui实现日期时间选择
  9. 在matlab中怎么录制音频_怎么录制淘宝页面中的视频?简单方法,轻松搞定
  10. Robots on a Grid CodeForces - 1335F(拓扑排序+正反建图+判环)