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

一、前言介绍

本章节主要介绍服务端在收到数据后,通过writeAndFlush发送ByteBuf字节码向客户端传输信息。因为我们使用客户端模拟器的编码是GBK格式,所以代码中也需要将字节码转换为GBK,否则会乱码。

二、开发环境

1、jdk1.8【jdk1.7以下只能部分支持netty】

2、Netty4.1.36.Final【netty3.x 4.x 5每次的变化较大,接口类名也随着变化】

3、telnet 测试【可以现在你的win7机器上测试这个命令,用于链接到服务端的测试命令】

三、代码示例

itstack-demo-netty-1-04
└── src├── main│   └── java│       └── org.itstack.demo.netty.server│           ├── MyChannelInitializer.java│           ├── MyServerHandler.java│           └── NettyServer.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) {// 基于换行符号channel.pipeline().addLast(new LineBasedFrameDecoder(1024));// 解码转String,注意调整自己的编码格式GBK、UTF-8channel.pipeline().addLast(new StringDecoder(Charset.forName("GBK")));// 在管道中添加我们自己的接收数据实现方法channel.pipeline().addLast(new MyServerHandler());}}

MyServerHandler.java

/*** 虫洞栈:https://bugstack.cn* 公众号:bugstack虫洞栈  {获取学习源码}* Create by fuzhengwei on 2019*/
public class MyServerHandler extends ChannelInboundHandlerAdapter {/*** 当客户端主动链接服务端的链接后,这个通道就是活跃的了。也就是客户端与服务端建立了通信通道并且可以传输数据*/@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {SocketChannel channel = (SocketChannel) ctx.channel();System.out.println("链接报告开始");System.out.println("链接报告信息:有一客户端链接到本服务端");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";ByteBuf buf = Unpooled.buffer(str.getBytes().length);buf.writeBytes(str.getBytes("GBK"));ctx.writeAndFlush(buf);}/*** 当客户端主动断开服务端的链接后,这个通道就是不活跃的。也就是说客户端与服务端的关闭了通信通道并且不可以传输数据*/@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";ByteBuf buf = Unpooled.buffer(str.getBytes().length);buf.writeBytes(str.getBytes("GBK"));ctx.writeAndFlush(buf);}/*** 抓住异常,当发生异常的时候,可以做一些相应的处理,比如打印日志、关闭链接*/@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {ctx.close();System.out.println("异常信息:rn" + cause.getMessage());}}

NettyServer.java

/*** 虫洞栈:https://bugstack.cn* 公众号:bugstack虫洞栈  {获取学习源码}* Create by fuzhengwei on 2019*/
public class NettyServer {public static void main(String[] args) {new NettyServer().bing(7397);}private void bing(int port) {//配置服务端NIO线程组EventLoopGroup parentGroup = new NioEventLoopGroup(); //NioEventLoopGroup extends MultithreadEventLoopGroup Math.max(1, SystemPropertyUtil.getInt("io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2));EventLoopGroup childGroup = new NioEventLoopGroup();try {ServerBootstrap b = new ServerBootstrap();b.group(parentGroup, childGroup).channel(NioServerSocketChannel.class)    //非阻塞模式.option(ChannelOption.SO_BACKLOG, 128).childHandler(new MyChannelInitializer());ChannelFuture f = b.bind(port).sync();System.out.println("itstack-demo-netty server start done. {关注公众号:bugstack虫洞栈,获取源码}");f.channel().closeFuture().sync();} catch (InterruptedException e) {e.printStackTrace();} finally {childGroup.shutdownGracefully();parentGroup.shutdownGracefully();}}}

四、测试结果

启动服务端NettyServer

启动模拟器NetAssist 发送数据测试

执行结果

itstack-demo-netty server start done. {关注公众号:bugstack虫洞栈,获取源码}
链接报告开始
链接报告信息:有一客户端链接到本服务端
链接报告IP:10.13.28.13
链接报告Port:7397
链接报告完毕
2019-08-05 16:03:31 接收到消息:你好,服务端。我是<bugstack虫洞栈>公众号,关注我获取源码。“我的结尾是一个换行符,用于传输半包粘包处理”
2019-08-05 16:03:32 接收到消息:你好,服务端。我是<bugstack虫洞栈>公众号,关注我获取源码。“我的结尾是一个换行符,用于传输半包粘包处理”
2019-08-05 16:03:33 接收到消息:你好,服务端。我是<bugstack虫洞栈>公众号,关注我获取源码。“我的结尾是一个换行符,用于传输半包粘包处理”
2019-08-05 16:03:33 接收到消息:你好,服务端。我是<bugstack虫洞栈>公众号,关注我获取源码。“我的结尾是一个换行符,用于传输半包粘包处理”
客户端断开链接/10.13.28.13:7397Process finished with exit code -1


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

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

    小傅哥 | 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中整型常量的长度,Java基础入门篇(三)——Java常量、变量,

    Java基础入门篇(三)--Java常量.变量, 一.Java常量 (一)什么是常量 常量指的是在程序中固定不变的值,是不能改变的数据.在Java中,常量包括整型常量.浮点型常量.布尔常量.字符常量等 ...

  4. java springboot微信公众号接收回复消息和超过5秒被动回复消息

    本次就是记录一下我的开发过程,不是教程,纯属自己做个笔记. 现在项目有个需求,需要用户在公众号发送图片消息的时候,我后台程序能接收到这个图片,并用ai处理图片并返回信息. 1.首先第一步要接收微信消息 ...

  5. 微信公众平台深度开发JAVA版第一季 08.接收普通消息1

    上一节讲了开发的接口接入这一部分,这是非常重要的. 实现业务的逻辑应该写在POST方法这一块. GET是消息验证用的,验证接口那一块的. XML数据包:腾讯服务器传过来的数据是XML格式的传到你的业务 ...

  6. 如何5分钟秒懂Java之基础入门篇 第一个hello word

    本来其实想讲一下这个Java基础入门系列_JDK的安装,后来想想还是算了.毕竟这就是相当于一个给电脑装一个APP,类似这么个流程. 还想说一个这个JDK一个必须要知道的知识点,那就是JDK的bin目录 ...

  7. 微信公众平台深度开发JAVA版第一季 10.接收普通消息3

    获取到从腾讯服务器过来的字符串,业务服务器可以拼接出来可以打印出来.后续的工作是把这个字符串封装成一个Bean对象. <xml><ToUserName><![CDATA[ ...

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

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

  9. netty案例,netty4.1中级拓展篇四《Netty传输文件、分片发送、断点续传》

    前言介绍 1.在实际应用中我们经常使用到网盘服务,他们可以高效的上传下载较大文件.那么这些高性能文件传输服务,都需要实现的分片发送.断点续传功能. 2.在Java文件操作中有RandomAccessF ...

最新文章

  1. 从0到1构建大数据生态系列1:数据蛮荒中的拓荒之举
  2. [原]请留心asp:Image控件中的ImageUrl属性
  3. 一场由nginx优化引起的tcp/ip及tcpdump研究
  4. Dubbo环境搭建-ZooKeeper注册中心
  5. Struts2开发基本步骤
  6. 转载:浏览器开发系列第一篇:如何获取最新chromium源码
  7. mysql函数时分秒转换_mysql函数 秒转换成时分秒
  8. python进程、线程、协程
  9. Django之ORM
  10. php淘客发单_如何使用PHP的curl函数调用维易淘客接口
  11. 数据结构 判断数组元素是否互不相同
  12. dsp 链接命令文件的写法
  13. 教你从进程中判断病毒木马的存在
  14. 粤嵌星计划打卡第三十二天(对象的销毁和垃圾收集机制)(java实现一个权限管理系统)
  15. Silverlight3.0教程下载
  16. 【Tools】HP/惠普v285w 量产工具
  17. 上海市计算机应用基础答案,计算机应用基础10统考(附答案)
  18. 二级分销跟差价收益有区别吗?
  19. git项目拉下来之后无法找到主加载类
  20. SpringBoot 结合 Mybatis 实现创建数据库表

热门文章

  1. mysql update from 语句_MySQL高频面试题01期:一条update语句的生命历程
  2. logistic回归分析优点_逻辑回归的简单介绍
  3. neo4j 机器学习_知识图谱实战系列四:neo4j的介绍和使用
  4. python3 copy_Python3 深浅拷贝
  5. linux动态链接库的创建
  6. 二本类 计算机类 大学录取分数线,重庆邮电大学什么专业实力最强?为什么二本专业都超一本线录取?...
  7. 一直在构建版本_教你如提升Gradle90%的构建速度
  8. 安装squid_CVE-2019-12527:Squid缓冲区溢出漏洞利用分析
  9. linux开启多少到多少端口命令,Linux端口命令
  10. 超级计算机手机芯片,美国开建arm超级计算机,单节点性能是手机芯片100倍