JAVA通信系列三:Netty入门总结
一、Netty学习资料
书籍《Netty In Action中文版》
对于Netty的十一个疑问
http://news.cnblogs.com/n/205413/
深入浅出Netty
http://wenku.baidu.com/view/7765bc2db4daa58da0114a4c.html
Netty了解与小试
http://www.cnblogs.com/xd502djj/archive/2012/06/25/2561318.html
Netty系列之Netty高性能之道【精彩】
http://www.infoq.com/cn/articles/netty-high-performance/
Netty系列之Netty 服务端创建【精彩】
http://www.infoq.com/cn/articles/netty-server-create
Netty 5用户指南
http://ifeve.com/netty5-user-guide/
基于Netty5.0入门案例六之NettyServer群发消息
http://www.bubuko.com/infodetail-575271.html
Netty5入门学习笔记002-TCP粘包/拆包问题的解决之道(上)
http://my.oschina.net/imhoodoo/blog/357290
基于Netty与RabbitMQ的消息服务
http://www.cnblogs.com/luxiaoxun/archive/2015/01/28/4257105.html
基于Netty5.0入门案例五之NettyServer字符串编码器
http://www.itstack.org/?post=9
二、代码示例
Hello world
1.编写处理器 DiscardServerHandler extends ChannelHandlerAdapter
2.编写Main方法,启动DiscardServerHandler
Echo
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ByteBuf in = (ByteBuf) msg;
try {
while (in.isReadable()) { // (1)
System.out.print((char) in.readByte());
System.out.flush();
}
} finally {
ReferenceCountUtil.release(msg); // (2)
}
}
Time
@Override
public void channelActive(final ChannelHandlerContext ctx) { // (1)
final ByteBuf time = ctx.alloc().buffer(4); // (2)
time.writeInt((int) (System.currentTimeMillis() / 1000L + 2208988800L));
final ChannelFuture f = ctx.writeAndFlush(time); // (3)
f.addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) {
assert f == future;
ctx.close();
}
}); // (4)
}
流数据的传输处理【分包,黏包】
1.ChannelHandler有2个生命周期的监听方法:handlerAdded()和handlerRemoved()。你可以完成任意初始化任务只要他不会被阻塞很长的时间。
public class TimeClientHandler extends ChannelHandlerAdapter {
private ByteBuf buf;
@Override
public void handlerAdded(ChannelHandlerContext ctx) {
buf = ctx.alloc().buffer(4); // (1)
}
@Override
public void handlerRemoved(ChannelHandlerContext ctx) {
buf.release(); // (1)
buf = null;
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ByteBuf m = (ByteBuf) msg;
buf.writeBytes(m); // (2)
m.release();
if (buf.readableBytes() >= 4) { // (3)
long currentTimeMillis = (buf.readInt() - 2208988800L) * 1000L;
System.out.println(new Date(currentTimeMillis));
ctx.close();
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}
2.TimeClientHandler拆分成2个处理器:TimeDecoder处理数据拆分的问题,TimeClientHandler原始版本的实现
public class TimeDecoder extends ByteToMessageDecoder { // (1)
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) { // (2)
if (in.readableBytes() < 4) {
return; // (3)
}
out.add(in.readBytes(4)); // (4)
}
}
用POJO代替ByteBuf
转载于:https://www.cnblogs.com/itfly8/p/5844929.html
JAVA通信系列三:Netty入门总结相关推荐
- JAVA通信系列三:Netty入门总结(转)
一.Netty学习资料 书籍<Netty In Action中文版> 对于Netty的十一个疑问 http://news.cnblogs.com/n/205413/ 深入浅出Netty h ...
- Java多线程系列(三):Java线程池的使用方式,及核心运行原理
之前谈过多线程相关的4种常用Java线程锁的特点,性能比较.使用场景,今天主要分享线程池相关的内容,这些都是属于Java面试的必考点. 为什么需要线程池 java中为了提高并发度,可以使用多线程共同执 ...
- Java Servlet系列之Servlet入门
什么是Servlet Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面.它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服 ...
- java基础系列:集合入门
集合框架: Java中的集合框架大类可分为Collection和Map:两者的区别: Collection是单列集合:Map是双列集合 Collection中只有Set系列要求元素唯一:Map中键需要 ...
- java线程同步的实现_【Java多线程系列三】实现线程同步的方法
packagecom.concurrent.test;importjava.util.Stack;importjava.util.concurrent.ArrayBlockingQueue;impor ...
- Java基础系列三之继承
继承 一.什么是继承 继承是一个类继承另一个类,这个类拥有被继承的类中所有的成员方法(除了父类的构造方法)和属性: 继承是面向对象特征之一: 实现继承的类称为子类或者派生类,被继承的类称为父类,或者称 ...
- Java自学指南三、入门视频优先
一门编程语言零基础,想要入门与求职,最快的方式是付钱参加培训班.原因很简单: 讲师都是 IT 企业出来的程序员,知道企业需要掌握什么样编程技能的人才 培训课程教了 n 遍,打磨的很适合不同基础的学员 ...
- Java学习系列及数据结构博客全目录
Java学习系列 Java学习系列(一)Java的运行机制.JDK的安装配置及常用命令详解 Java学习系列(二)Java注释.标识符.基本数据类型及其转换易错点详解 Java学习系列(三)Java运 ...
- Java爬虫系列之实战:爬取酷狗音乐网 TOP500 的歌曲(附源码)
在前面分享的两篇随笔中分别介绍了HttpClient和Jsoup以及简单的代码案例: Java爬虫系列二:使用HttpClient抓取页面HTML Java爬虫系列三:使用Jsoup解析HTML 今天 ...
最新文章
- 的正确使用_弹力袜的正确使用
- 10.matlab中sort , min/max以及ceil 函数
- 设置***遇到一个小问题
- Tomcat 7最大并发连接数的正确修改方法(转)
- 事件时间/处理时间/进入时间(Event Time / Processing Time / Ingestion Time)
- SAP ABAP实用技巧介绍系列之如何生成值为NULL的table row
- oracle同步恢复目录,Oracle创建恢复目录(catalog)
- java引用类型_Java引用类型
- gzip算法源代码 - tankzhouqiang - 博客园
- JVM GC调优参数说明
- 阶段3 3.SpringMVC·_07.SSM整合案例_06.ssm整合之编写MyBatis框架
- 金税开票软件,开票时弹出FRM-000013
- 用Python实现双色球随机选号
- android wps页面设置背景图片,如何给手机版WPS的文档设置图片背景
- MySQL实战演练——如何才能构建逾期用户画像?【数据可视化】
- 待办事项-JavaScript实现
- 前端学习——HTML(一)
- Gate 7.2的学习笔记(一)
- 美丽乡村可行性研究报告
- 一个自动重连拨号脚本
热门文章
- .net网格怎么把值插入指定列表_Python列表有什么内置函数可以使用,怎么使用这些函数...
- byfen网java_Java企业级分布式架构师第10期2020年-开课吧全套
- 基于Arduino ATmega328人脸识别IOT演示门锁
- 关于组织参加2021年全国大学生 智能汽车竞赛东北赛区比赛的报名通知
- 第四届全国大学生智能汽车竞赛获奖名单
- 深度神经网络控制的巡线智能车
- 太难了…期待一切都能赶快好起来吧
- Jquery中获取select选中的文本与值
- js判断是由含有a节点_如何在 JS 中判断数组是否包含指定的元素(多种方法)
- crypto安装_KubeEdge 完整安装 amp; 部署小指南