netty编程一:快速入门
服务器端编程
第一步:maven 依赖 netty-all.jar,详情参考文章最后的maven依赖
第二步:创建服务端的NIO线程组EventLoopGroup;
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
第三步:创建并配置服务端启动辅助类ServerBootstrap;
1、创建ServerBootstrap
ServerBootstrap b = new ServerBootstrap();
2、配置ServerBootstrap实例的线程组(group):绑定线程组
b.group(bossGroup, WorkerGroup);
3、配置ServerBootstrap实例的channel:将创建的channel为NioServerSocketChannel
b.channel(NioServerSocketChannel.class);
4、配置ServerBootstrap实例的option:配置NioServerSocketChannel的tcp参数,eg:将他的backlog设置为1024;
b.option(ChannelOption.SO_BACKLOG, 1024);
5、配置ServerBootstrap实例的childHandler:绑定I/O事件的处理类;eg 半包问题处理,记录日志,数据编码解码,用户自定义的处理等等
// 此处注意:ChildChannelHandler是自定义的,继承了ChannelHandlerAdapter类,netty框架让我们可以集中精力用于实际业务上的数据处理,此处的内容后续文章在做重点分析
b.childHandler(new ChildChannelHandler());
6、配置ServerBootstrap实例的绑定并监听port与等待链路的关闭:绑定port,并调用同步阻塞方法sync来等待绑定操作完成,完成后会返回channelFuture实例(异步操作的通知回调)
// 绑定端口,同步等待绑定成功
ChannelFuture f = b.bind(8888).sync();
// 阻塞等待服务端监听端口关闭,目的:等待服务端链路关闭后main函数才退出
f.channel().closeFuture().sync();
7、注意:退出时,记得释放线程池资源
try{
// 服务器启动辅助类的创建与配置内容
// ...
}finally{
// 优雅退出,通过调用线程组的shutdownGracefully方法释放相关资源
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
客户端编程
第一步:maven 依赖 netty-all.jar
第二步:创建客户端的NIO线程组EventLoopGroup;
EventLoopGroup group = new NioEventLoopGroup();
第三步:创建并配置客户端启动辅助类Bootstrap;
1、创建Bootstrap
Bootstrap b = new Bootstrap();
2、配置Bootstrap实例的线程组(group):绑定线程组
b.group(group);
3、配置Bootstrap实例的channel:将创建的channel为NioSocketChannel
b.channel(NioSocketChannel.class);
4、配置Bootstrap实例的option:配置NioSocketChannel的tcp参数,eg:将他的nodelay设置为true;
b.option(ChannelOption.TCP_NODELAY, true);
5、配置Bootstrap实例的handler:绑定I/O事件的处理类;eg 半包问题处理,记录日志,数据编码解码,用户自定义的处理等等
// 此处注意:TimeClientHandler是自定义的,继承了ChannelHandlerAdapter类,netty框架让我们可以集中精力用于实际业务上的数据处理,此处的内容后续文章在做重点分析
b.handler(new ChannelInitializer<SocketChannel>(){
@Override
public void initChannel(SocketChannel ch) throws Exception{
ch.pipeline().addLast(new TimeClientHandler())
}
});
6、配置Bootstrap实例的绑定并监听port与等待链路的关闭:绑定port,并调用同步阻塞方法sync来等待绑定操作完成,完成后会返回channelFuture实例(异步操作的通知回调)
// 绑定服务器的IP和端口,同步等待连接指定服务器成功
ChannelFuture f = b.connect(127.0.0.1,8888).sync();
// 阻塞等待服务端监听端口关闭,目的:等待服务端链路关闭后main函数才退出
f.channel().closeFuture().sync();
7、注意:退出时,记得释放线程池资源
try{
// 服务器启动辅助类的创建与配置内容
// ...
}finally{
// 优雅退出,通过调用线程组的shutdownGracefully方法释放相关资源
group.shutdownGracefully();
}
关于netty的maven依赖
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.33.Final</version>
</dependency>
netty编程一:快速入门的更多相关文章
- Swift语言快速入门
Swift语言快速入门(首部同步新版官方API文档和语法的Swift图书,确保代码可编译,作者专家在线答疑,图书勘误实时跟进) 极客学院 编著 ISBN 978-7-121-24328-8 201 ...
- Yacc 与 Lex 快速入门
Yacc 与 Lex 快速入门 Lex 与 Yacc 介绍 Lex 和 Yacc 是 UNIX 两个非常重要的.功能强大的工具.事实上,如果你熟练掌握 Lex 和 Yacc 的话,它们的强大功能使创建 ...
- Windows下FFmpeg快速入门
本系列文章导航 Windows下FFmpeg快速入门 ffmpeg参数解释 mencoder和ffmpeg参数详解(Java处理视频) Java 生成视频缩略图(ffmpeg) 使用ffmpeg进行视 ...
- netty深入学习之一: 入门篇
netty深入学习之一: 入门篇 本文代码下载: http://download.csdn.net/detail/cheungmine/8497549 1)Netty是什么 Netty是Java NI ...
- Spring Boot 2.0 的快速入门(图文教程)
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! Spring Boot 2.0 的快速入门(图文教程) 大家都 ...
- SpringBoot系列: RestTemplate 快速入门
====================================相关的文章====================================SpringBoot系列: 与Spring R ...
- logstash快速入门实战指南-Logstash简介
作者其他ELK快速入门系列文章 Elasticsearch从入门到精通 Kibana从入门到精通 Logstash是一个具有实时流水线功能的开源数据收集引擎.Logstash可以动态统一来自不同来源的 ...
- 零基础快速入门web学习路线(含视频教程)
下面小编专门为广大web学习爱好者汇总了一条完整的自学线路:零基础快速入门web学习路线(含视频教程)(绝对纯干货)适合初学者的最新WEB前端学习路线汇总! 在当下来说web前端开发工程师可谓是高福利 ...
- Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 6. 条件
前面的教程中,我们已经可以让小海龟绘制出各种图形了.但是,所有绘图的代码都是预先编好的,程序一旦运行起来,运行结果(绘制的图形)就是固定不变的.这一节中,咪博士将教大家如何让海龟响应用户的输入. im ...
随机推荐
- Ceph rdb
Ceph 独一无二地用统一的系统提供了对象.块.和文件存储功能,它可靠性高.管理简便.并且是自由软件. Ceph 的强大足以改变公司的 IT 基础架构.和管理海量数据. Ceph 可提供极大的伸缩性— ...
- C++: 模板函数定义与声明分离;
我们知道模板函数或模板类的定义一般都是和声明一起在头文件中,但是这样的话, 就暴露了内部实现,有什么办法能够将定义和声明进行分离呢? 答案是: 有的: 头文件: test.h; class test ...
- 从Random Walk谈到Bacterial foraging optimization algorithm(BFOA),再谈到Ramdom Walk Graph Segmentation图分割算法
1. 从细菌的趋化性谈起 0x1:物质化学浓度梯度 类似于概率分布中概率密度的概念.在溶液中存在不同的浓度区域. 如放一颗糖在水盆里,糖慢慢溶于水,糖附近的水含糖量比远离糖的水含糖量要高,也就是糖附近 ...
- 010-3 Socket协议ProtocolType
ProtocolType成员 成员名称 说明 Ggp 网关到网关协议. Icmp Internet 控制消息协议. IcmpV6 IPv6 的 Internet 控制消息协议. Idp Interne ...
- java 中使用RSA非对称性加密解密
需要引入的jar包:bcprov-jdk15on-161.jar 下载地址:https://www.bouncycastle.org/latest_releases.html //公钥加密 publi ...
- [Android] TabLayout设置下划线(Indicator)宽度
在使用TabLayout的过程中,为每个标签添加一个 下划线,但发现每个下划线的 宽度 都是一样的,例如会如下显示 这样很难看,所以必须进行调整后的效果如下: 看,这样不是非常和谐啦!~~ 实现方法很 ...
- C语言数据类型和C#的区别
- Django commands自定制
什么是Django Commands Django 对于命令的添加有一套规范,你可以为每个app 指定命令.通俗一点讲,比如在使用manage.py文件执行命令的时候,可以自定制自己的命令,来实现命令 ...
- C# - 设计模式 - 钩子模式
钩子模式 问题场景 如何控制抽象类的行为?解决办法是靠钩子!抽象类公布一个虚方法,由子类自行决定是否重写它,抽象类以钩子做判定,如果返回真则执行某个方法,否则不执行.为什么钩子不能是抽象的,因为如果钩 ...
- HDU - 1036
题意描述很垃圾,后来看别人代码才知道怎么回事:对(题目所给d/总时间:所有时间加起来)四舍五入并取整,然后对结果/60得到用了几分钟:对结果%60得到用了几秒. presentation error一 ...