内容简介:说说写这个框架的原因: 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爬虫框架
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Ordering Disorder
Khoi Vinh / New Riders Press / 2010-12-03 / USD 29.99
The grid has long been an invaluable tool for creating order out of chaos for designers of all kinds—from city planners to architects to typesetters and graphic artists. In recent years, web designers......一起来看看 《Ordering Disorder》 这本书的介绍吧!