netty基础教程-3、helloworld(cs模式)
功能实现
服务端
- 接受客户端数据
- 响应结果给客户端
客户端
- 发送请求给服务端
- 接受服务端的响应
服务端实现
启动类: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模式)相关推荐
- ai切换rgb模式_AI基础教程:如何更改CMYK模式?更改的两个方法
今天分享的文章讲一下AI中更改CMYK模式教程. 方法一:将新的Illustrator文档转换为CMYK 1.打开Adobe Illustrator.单击桌面上的Illustrator图标,或在屏幕左 ...
- Hadoop入门基础教程 Hadoop之单机模式搭建
单机模式所需要的系统资源是最少的,这种安装模式下,Hadoop的core-site.xml.mapred-site.xml.hdfs-site.xml配置文件均为空.默认情况下,官方hadoop-1. ...
- Chrome扩展开发基础教程(附HelloWorld)
1 概述 Chrome扩展开发的基础教程,代码基于原生JS+H5,教程内容基于谷歌扩展开发官方文档. 2 环境 Chrome 88.0.4324.96 Chromium 87.0.4280.141 B ...
- Python绘图之matplotlib基础教程:matplotlib库图表绘制中常规设置大全(交互模式、清除原有图像、设置横坐标显示文字/旋转角度、添加图例、绘图布局自动调整、图像显示、图像暂停)
Python绘图之matplotlib基础教程:matplotlib库图表绘制中常规设置大全(交互模式.清除原有图像.设置横坐标显示文字/旋转角度.添加图例.绘图布局自动调整.图像显示.图像暂停) 目 ...
- UEFI 基础教程 (一) - 运行第一个APP HelloWorld
UEFI 基础教程 (二) - 运行第一个APP HelloWorld 一.代码编写: 1.edk2/OvmfPkg/HelloWorld/HelloWorld.c: #include <Uef ...
- php基础教程 第一步 环境配置及helloworld
PHP 是服务器端脚本语言.全称为 Hypertext Preprocessor 为超文本预处理器. 据说php8不久后也要发布了,趁着8还没有发布赶紧写一个php5到php7(在基础教程写完后将写p ...
- ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程
ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单 ...
- Java Media Framework 基础教程
Java Media Framework 基础教程 作者:Eric Olson 来源:ibm 摘要: 很少发现有关于jmf方面的中文资料,这是在IBM上面找的一本书,可作为jmf的入门学习,业 ...
- ASP.NET Core 新建项目 - macOS 环境 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 新建项目 - macOS 环境 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 新建项目 - macOS 环境 对于任何语言和 ...
最新文章
- nginx各个版本下载地址
- Python的zip
- Vue中组态实现方案-BaseMap的使用
- 征战蓝桥 —— 2014年第五届 —— C/C++A组第4题——史丰收速算
- 如何将idea自带的maven添加到环境变量
- 触发器-当表1插入数据时将表1的数据插入表2
- linux脚本done报错,很简单的脚本程序,总是报错
- 【数据分析】脑图讲述数据分析方法论
- [转载] Python 内置函数 dir()
- 阿里、Uber都在用的Flink你了解多少?
- Final Cut Pro X for Mac有哪些新功能?Final Cut Pro X Mac版怎么样?
- Mysql数据库启动命令
- winform窗体——布局方式
- 主机前置耳机孔没声音
- Visio实现箭头反向
- metro风格的特点
- linux中硬链接为什么不能跨分区
- 开发人员用的提交测试环境的AutoIT脚本
- 解决iphone插上mac电脑充电不停的断开和链接问题
- php fwrite 图片,PHP fwrite( )用法及代码示例
热门文章
- 控制结构:1.台球游戏
- python抓取网站88titienmae88中的“图片区”的第一页的所有图片
- python 已知三角形的三条边,通过反三角函数计算出三角形的三个角;其中用到math的引用;
- 显示屏服务器出错,电脑显示屏卡顿和出现错误提示怎么办
- 踩坑:M1芯片Mac Book使用IDEA旗舰版卡顿问题
- SpringBoot+Thymeleaf图片上传
- 使用PhotoShop拼接遥感影像
- 商用密码产品及对应规范介绍
- BeatBox终极版——Head first java 650
- mybatis-plus打印sql日志和参数到日志文件