功能实现

服务端

  1. 接受客户端数据
  2. 响应结果给客户端

客户端

  1. 发送请求给服务端
  2. 接受服务端的响应

服务端实现

启动类:Server.java

public class Server {public static void main(String[] args) throws Exception{//创建两个组,分别用来接受客户端情求和处理客户端消息的NioEventLoopGroup bossGroup = new NioEventLoopGroup();NioEventLoopGroup workGroup = new NioEventLoopGroup();ServerBootstrap b = new ServerBootstrap();//配置服务端ChannelFuture cf = b.group(bossGroup,workGroup).channel(NioServerSocketChannel.class)//1).childHandler(new ServerChannelInit()).bind(8899).sync();System.out.println("服务端初始化完成!!!");//最后关闭服务端资源cf.channel().closeFuture().sync();bossGroup.shutdownGracefully();workGroup.shutdownGracefully();System.out.println("服务端停止服务!!!");}
}

1)、在这里将业逻辑注入,这样就很好的将业务和IO操作分离开了

通道初始化类:ServerChannelInit.java

public class ServerChannelInit extends ChannelInitializer<NioSocketChannel> {@Overrideprotected void initChannel(NioSocketChannel ch) throws Exception {//对服务端管道进行配置,编解码,Handler的处理顺序等等ch.pipeline().addLast(new ServerHandler());}
}

通道数据处理类:ServerHandler.java

public class ServerHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {try {//转换数据ByteBuf byteBuf = (ByteBuf) msg;byte[] bytes = new byte[byteBuf.readableBytes()];byteBuf.readBytes(bytes);System.out.println("接受到数据是:" + new String(bytes, "UTF-8"));//返回响应ByteBuf resp = Unpooled.copiedBuffer("服务端已经接受数据!!", CharsetUtil.UTF_8);ctx.writeAndFlush(resp);}finally {//释放ReferenceCountUtil.release(msg);}}@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {System.out.println("=============test通道激活============");super.channelActive(ctx);}@Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {System.out.println("=============test通道激活ing============");super.channelInactive(ctx);}@Overridepublic void channelReadComplete(ChannelHandlerContext ctx) throws Exception {System.out.println("=============test通道数据读取完毕!!============");super.channelReadComplete(ctx);}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {System.out.println("=============test通道激活出现异常============");super.exceptionCaught(ctx, cause);ctx.close();}
}

客户端实现

启动类:Client.java

public class Client {public static void main(String[] args) throws Exception{NioEventLoopGroup workGroup = new NioEventLoopGroup();Bootstrap b = new Bootstrap();ChannelFuture cf = b.group(workGroup).channel(NioSocketChannel.class).handler(new ClientChannelInit()).connect("127.0.0.1", 8899).sync();cf.channel().writeAndFlush(Unpooled.copiedBuffer("hello server",CharsetUtil.UTF_8));System.out.println("客户端初始化完成!!!!");cf.channel().closeFuture().sync();}
}

通道初始化类:ClientChannelInit.java

public class ClientChannelInit extends ChannelInitializer<NioSocketChannel> {@Overrideprotected void initChannel(NioSocketChannel ch) throws Exception {ch.pipeline().addLast(new ClientHandler());}
}

通道数据处理类:ClientHandler.java

public class ClientHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {try{ByteBuf byteBuf = (ByteBuf)msg;byte[] bytes = new byte[byteBuf.readableBytes()];byteBuf.readBytes(bytes);System.out.println("接受到服务端的消息:"+new String(bytes,"UTF-8"));}finally {ReferenceCountUtil.release(msg);}}
}

总结

这里的操作有的还是很冗余的;强转数据,关闭ByteBuf等

github源码: https://github.com/wcjwctwy/netty-study

netty基础教程-3、helloworld(cs模式)相关推荐

  1. ai切换rgb模式_AI基础教程:如何更改CMYK模式?更改的两个方法

    今天分享的文章讲一下AI中更改CMYK模式教程. 方法一:将新的Illustrator文档转换为CMYK 1.打开Adobe Illustrator.单击桌面上的Illustrator图标,或在屏幕左 ...

  2. Hadoop入门基础教程 Hadoop之单机模式搭建

    单机模式所需要的系统资源是最少的,这种安装模式下,Hadoop的core-site.xml.mapred-site.xml.hdfs-site.xml配置文件均为空.默认情况下,官方hadoop-1. ...

  3. Chrome扩展开发基础教程(附HelloWorld)

    1 概述 Chrome扩展开发的基础教程,代码基于原生JS+H5,教程内容基于谷歌扩展开发官方文档. 2 环境 Chrome 88.0.4324.96 Chromium 87.0.4280.141 B ...

  4. Python绘图之matplotlib基础教程:matplotlib库图表绘制中常规设置大全(交互模式、清除原有图像、设置横坐标显示文字/旋转角度、添加图例、绘图布局自动调整、图像显示、图像暂停)

    Python绘图之matplotlib基础教程:matplotlib库图表绘制中常规设置大全(交互模式.清除原有图像.设置横坐标显示文字/旋转角度.添加图例.绘图布局自动调整.图像显示.图像暂停) 目 ...

  5. UEFI 基础教程 (一) - 运行第一个APP HelloWorld

    UEFI 基础教程 (二) - 运行第一个APP HelloWorld 一.代码编写: 1.edk2/OvmfPkg/HelloWorld/HelloWorld.c: #include <Uef ...

  6. php基础教程 第一步 环境配置及helloworld

    PHP 是服务器端脚本语言.全称为 Hypertext Preprocessor 为超文本预处理器. 据说php8不久后也要发布了,趁着8还没有发布赶紧写一个php5到php7(在基础教程写完后将写p ...

  7. ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程

    ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单 ...

  8. Java Media Framework 基础教程

    Java Media Framework 基础教程 作者:Eric Olson     来源:ibm 摘要: 很少发现有关于jmf方面的中文资料,这是在IBM上面找的一本书,可作为jmf的入门学习,业 ...

  9. ASP.NET Core 新建项目 - macOS 环境 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 新建项目 - macOS 环境 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 新建项目 - macOS 环境 对于任何语言和 ...

最新文章

  1. nginx各个版本下载地址
  2. Python的zip
  3. Vue中组态实现方案-BaseMap的使用
  4. 征战蓝桥 —— 2014年第五届 —— C/C++A组第4题——史丰收速算
  5. 如何将idea自带的maven添加到环境变量
  6. 触发器-当表1插入数据时将表1的数据插入表2
  7. linux脚本done报错,很简单的脚本程序,总是报错
  8. 【数据分析】脑图讲述数据分析方法论
  9. [转载] Python 内置函数 dir()
  10. 阿里、Uber都在用的Flink你了解多少?
  11. Final Cut Pro X for Mac有哪些新功能?Final Cut Pro X Mac版怎么样?
  12. Mysql数据库启动命令
  13. winform窗体——布局方式
  14. 主机前置耳机孔没声音
  15. Visio实现箭头反向
  16. metro风格的特点
  17. linux中硬链接为什么不能跨分区
  18. 开发人员用的提交测试环境的AutoIT脚本
  19. 解决iphone插上mac电脑充电不停的断开和链接问题
  20. php fwrite 图片,PHP fwrite( )用法及代码示例

热门文章

  1. 控制结构:1.台球游戏
  2. python抓取网站88titienmae88中的“图片区”的第一页的所有图片
  3. python 已知三角形的三条边,通过反三角函数计算出三角形的三个角;其中用到math的引用;
  4. 显示屏服务器出错,电脑显示屏卡顿和出现错误提示怎么办
  5. 踩坑:M1芯片Mac Book使用IDEA旗舰版卡顿问题
  6. SpringBoot+Thymeleaf图片上传
  7. 使用PhotoShop拼接遥感影像
  8. 商用密码产品及对应规范介绍
  9. BeatBox终极版——Head first java 650
  10. mybatis-plus打印sql日志和参数到日志文件