内容简介:说说写这个框架的原因: 1、作者本人是一个码农,比较喜欢研究技术,特别是网络通讯。 2、JDK1.7升级了NIO类库,升级后的NIO类库被称为NIO 2.0。正式提供了异步文件I/O操作,同时提供了与UNIX网络编程事件驱动I/O...
说说写这个框架的原因:
1、作者本人是一个码农,比较喜欢研究技术,特别是网络通讯。
2、JDK1.7升级了NIO类库,升级后的NIO类库被称为NIO 2.0。正式提供了异步文件I/O操作,同时提供了与UNIX网络编程事件驱动I/O对应的AIO。AIO的发布使得实现一套网络通讯框架变得相对简单。但如果你不努力,可能也无法理解哦。
3、本人对netty比较喜欢,无论是其性能还是编程思想(JBOSS提供的一个 java 开源网络框架,可以说是java网络通讯里的一哥,极其稳定和强大的性能使得被广泛使用)
4、有了netty为何还要自己造轮子?这里有两个原因,其一是本人就喜欢造轮子,这是病,改不了。其二,netty经过多年的发展,其生态体系已经比较庞大,导致其代码比较臃肿,再者其高深的设计哲学我等凡夫俗子很难悟其精髓。因而索性自己造一个。
5、netty毕竟是别人的东西,还是老外的。并且国内也有许多优秀的开源框架。想了想,为何不自己搞一个呢,于是乎脑袋发热,抽时间造了一个。
说说getty的特点:
1、完全基于java aio,整个工程只依赖 slf4j(一个日志的门面框架),对工程几乎没有入侵性。
2、借鉴了netty和其他框架的部分优秀设计思想,如责任链、内存池化、零拷贝等优秀的设计模式。
3、简洁的代码,清晰的注释,以及提供了直接可用的多个插件,只要用过netty,那么学习成本基本为零。
4、可直接在安卓上使用,服务与客户端使用几乎一致(api 26+或android 8.0+)
说说getty的性能和稳定性:
硬件条件:cpu:i7-7700 | 内存:16G | 网络:局域网 | 操作系统:win10家庭版 | jdk 8
经过本人简单的测试,整体的性能和稳定性还是不错的:
1、单连接发送一百万条文本消息耗时277毫秒,这个性能总体上还过得去。
2、开启了SSL以后发送一百万条文本消息大概耗时3.8秒,这个性能也算乐观,因为毕竟SSL本身对消息的加密和解密是非常消耗性能的。
3、同时开启10条连接,每条连接发送一百万条文本消息,每条连接平均耗时是比较均衡的,平均三百多毫秒。性能非常可观
4、服务器启动时的内存消耗,启动时内存消耗非常小,占用还不到40m
5、连续发送一百万条消息时的内存消耗,大概消耗160m左右,而且内存回收也非常迅速
如何使用:
先添加 slf4j 依赖:
//java 中使用
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
安卓中使用添加安卓版本:
// https://mvnrepository.com/artifact/org.slf4j/slf4j-android
implementation group: 'org.slf4j', name: 'slf4j-android', version: '1.7.26'
1、服务器端启动:
AioServerStarter server = new AioServerStarter(5555);
server.bossThreadNum(10).channelInitializer(new ChannelInitializer() {
@Override
public void initChannel(AioChannel channel) throws Exception {
//初始化责任链
DefaultChannelPipeline defaultChannelPipeline = channel.getDefaultChannelPipeline();
//添加结束符处理器
defaultChannelPipeline.addLast(new DelimiterFrameDecoder(DelimiterFrameDecoder.lineDelimiter));
//添加string类型消息解码器
defaultChannelPipeline.addLast(new StringDecoder());
//自定义的消息处理器
defaultChannelPipeline.addLast(new SimpleHandler());
}
});
server.start();
//简单的消息处理器
public class SimpleHandler extends SimpleChannelInboundHandler<String> {
@Override
public void channelAdded(AioChannel aioChannel) {
System.out.println("连接过来了");
}
@Override
public void channelClosed(AioChannel aioChannel) {
System.out.println("连接关闭了");
}
@Override
public void channelRead0(AioChannel aioChannel, String str) {
System.out.println("读取消息:" +str);
try {
byte[] msgBody = (str + "\r\n").getBytes("utf-8");
//返回消息给客户端
aioChannel.writeAndFlush(msgBody);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
@Override
public void exceptionCaught(AioChannel aioChannel, Throwable cause, PipelineDirection pipelineDirection) {
System.out.println("出错了");
}
}
2、客户端启动:
AioClientStarter client = new AioClientStarter("127.0.0.1", port);
client.channelInitializer(new ChannelInitializer() {
@Override
public void initChannel(AioChannel channel) throws Exception {
//责任链
DefaultChannelPipeline defaultChannelPipeline = channel.getDefaultChannelPipeline();
//字符串编码器
defaultChannelPipeline.addLast(new StringEncoder());
//指定结束符解码器
defaultChannelPipeline.addLast(new DelimiterFrameDecoder(DelimiterFrameDecoder.lineDelimiter));
//字符串解码器
defaultChannelPipeline.addLast(new StringDecoder());
//定义消息解码器
defaultChannelPipeline.addLast(new SimpleHandler());
}
});
try {
client.start();
Thread.sleep(1000);
//获取通道
AioChannel aioChannel = client.getAioChannel();
//发送消息
String s = "me\r\n";
byte[] msgBody = s.getBytes("utf-8");
aioChannel.writeAndFlush(msgBody);
} catch (Exception e) {
e.printStackTrace();
}
最简单的使用方式就完成了。
更多详情可以查看码云:https://gitee.com/kokjuis/getty
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 自己实现集合框架(十):顺序栈的实现
- Golang实现简单爬虫框架(4)——队列实现并发任务调度
- 简易RPC框架实现
- 优秀开源框架的扩展机制实现
- Go 实现简易 RPC 框架
- 如何实现一个Python爬虫框架
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
学习JavaScript数据结构与算法(第2版)
[巴西] Loiane Groner / 邓 钢、孙晓博、吴 双、陈 迪、袁 源 / 人民邮电出版社 / 2017-9 / 49.00元
本书首先介绍了JavaScript 语言的基础知识以及ES6 和ES7 中引入的新功能,接下来讨论了数组、栈、队列、链表、集合、字典、散列表、树、图等数据结构,之后探讨了各种排序和搜索算法,包括冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序、顺序搜索、二分搜索,然后介绍了动态规划和贪心算法等常用的高级算法以及函数式编程,最后还介绍了如何计算算法的复杂度。一起来看看 《学习JavaScript数据结构与算法(第2版)》 这本书的介绍吧!