netty上手
关于netty的基础NIO,请参见:NIO原理及实例
下面介绍Netty的上手使用;
首先为项目添加jar依赖:
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.8.Final</version>
</dependency>
1、开始写代码,一般是先写输入输出的逻辑(handler)
handler一般继承于SimpleChannelInboundHandler 或者 ChannelOutboundHandlerAdapter,区别在于simple。。不需要手动释放消息
输入handler 继承于SimpleChannelInboundHandler
package com.pt.netty.client; import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler; /**
* @author panteng
* @description 继承自simple会自动释放数据,否则需要手动释放
* @date 17-3-19.
*/
@ChannelHandler.Sharable
public class InputHandler1 extends SimpleChannelInboundHandler<ByteBuf> { /**
* 读数据
*
* @param channelHandlerContext
* @param byteBuf
* @throws Exception
*/
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {
System.out.println("InputHandler1:channelRead0");
} /**
* 读数据,首先调此函数,父类默认调用channelRead0
*
* @param ctx
* @param msg
* @throws Exception
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println("InputHandler1:channelRead");
if (msg instanceof ByteBuf) {
System.out.println(new String(ByteBufUtil.getBytes((ByteBuf) msg)));
}
ctx.writeAndFlush(Unpooled.copiedBuffer("OK".getBytes()));
ctx.fireChannelRead(msg);
// super.channelRead(ctx, msg);
}
/**
* 连接成功
*
* @param ctx
* @throws Exception
*/
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println("InputHandler1:channelActive 连接成功");
// super.channelActive(ctx);
} /**
* 异常处理
*
* @param ctx
* @param cause
* @throws Exception
*/
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
super.exceptionCaught(ctx, cause);
}
}
InputHandler1
package com.pt.netty.client; import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler; /**
* @author panteng
* @description 继承自simple会自动释放数据,否则需要手动释放
* @date 17-3-19.
*/
@ChannelHandler.Sharable
public class InputHandler2 extends SimpleChannelInboundHandler<ByteBuf> { /**
* 读数据
*
* @param channelHandlerContext
* @param byteBuf
* @throws Exception
*/
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {
System.out.println("InputHandler2:channelRead0");
} /**
* 读数据,首先调此函数,父类默认调用channelRead0
*
* @param ctx
* @param msg
* @throws Exception
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println("InputHandler2:channelRead");
// super.channelRead(ctx, msg);
} /**
* 连接成功
*
* @param ctx
* @throws Exception
*/
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println("InputHandler2:channelActive 连接成功");
// super.channelActive(ctx);
} /**
* 异常处理
*
* @param ctx
* @param cause
* @throws Exception
*/
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
cause.printStackTrace();
ctx.close();
super.exceptionCaught(ctx, cause);
}
}
InputHandler2
输出handler
package com.pt.netty.client; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOutboundHandlerAdapter;
import io.netty.channel.ChannelPromise; /**
* 继承ChannelOutboundHandlerAdapter方法时,必须执行super.方法,否则阻塞无法执行
*
* @author panteng
* @description
* @date 17-3-19.
*/
public class OutputHandler extends ChannelOutboundHandlerAdapter {
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
// super.write(ctx, msg, promise);
System.out.println("OutputHandler:write");
ctx.write(msg); }
}
OutputHandler
2、main函数
package com.pt.netty.client; import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel; /**
* @author panteng
* @description
* @date 17-3-19.
*/
public class ClientOfNetty {
public static void main(String[] arges) {
// 可以指定线程数目(不指定采用默认值 CPU的2倍)
EventLoopGroup group = new NioEventLoopGroup(1);
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group).channel(NioSocketChannel.class).remoteAddress("10.232.36.21", 4700)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
socketChannel.pipeline().addLast(new OutputHandler());
socketChannel.pipeline().addLast(new InputHandler1());
socketChannel.pipeline().addLast(new InputHandler2());
}
});
ChannelFuture f = bootstrap.connect().sync();// 阻塞
Thread.sleep(5000);
f.channel().close().sync();
} catch (Exception e) {
e.printStackTrace();
} finally {
group.shutdownGracefully();
}
System.out.println("退出主函数。。。 。。。");
}
}
ClientOfNetty
netty上手的更多相关文章
- Netty中的坑(下篇)
其实这篇应该叫Netty实践,但是为了与前一篇名字保持一致,所以还是用一下坑这个名字吧. Netty是高性能Java NIO网络框架,在很多开源系统里都有她的身影,而在绝大多数互联网公司所实施的服务化 ...
- Clojure上手
Clojure,这是什么鬼?一门基于JVM(现在也有基于.NET CLR的了:Clojure CLR) 的函数式编程语言.在JVM平台运行的时候,会被编译为JVM的字节码进行运算..为什么要学它?其设 ...
- Android 基于Netty的消息推送方案之字符串的接收和发送(三)
在上一篇文章中<Android 基于Netty的消息推送方案之概念和工作原理(二)> ,我们介绍过一些关于Netty的概念和工作原理的内容,今天我们先来介绍一个叫做ChannelBuffe ...
- Java NIO框架Netty教程(一) – Hello Netty
先啰嗦两句,如果你还不知道Netty是做什么的能做什么.那可以先简单的搜索了解一下.我只能说Netty是一个NIO的框架,可以用于开发分布式的Java程序.具体能做什么,各位可以尽量发挥想象.技术,是 ...
- Android 基于Netty接收和发送推送解决方案的消息字符串(三)
在上一篇文章中<Android 基于Netty的消息推送方案之概念和工作原理(二)> .我们介绍过一些关于Netty的概念和工作原理的内容,今天我们先来介绍一个叫做ChannelBuffe ...
- Java NIO框架Netty课程(一) – Hello Netty
首先啰嗦2,假如你不知道Netty怎么办怎么办.它可以是一个简单的搜索,找出.我只能说Netty是NIO该框架,它可用于开发分布式Java计划.详细情况可以做,我们可以尝试用你的想象力. 技术,它是服 ...
- [转载] Netty教程
转载自http://blog.csdn.net/kobejayandy/article/details/11493717 先啰嗦两句,如果你还不知道Netty是做什么的能做什么.那可以先简单的搜索了解 ...
- Netty(一):入门篇
匠心零度 转载请注明原创出处,谢谢! 说在前面 上篇文章对Netty进行了初探:Netty初探,主要介绍了下我们为什么需要学习netty.netty介绍等:本篇文章接着上篇文章的内容.本篇为了方便大家 ...
- netty深入学习之一: 入门篇
netty深入学习之一: 入门篇 本文代码下载: http://download.csdn.net/detail/cheungmine/8497549 1)Netty是什么 Netty是Java NI ...
随机推荐
- 7、easyui 表单
这是最后一个小节了,后面将会使用一个小项目来进一步实用讲解: 在之前的什么相关只是点都以及讲过了或者说涉及到过,如datagrid表格,树形菜单,布局面板panel,页签,拖放功能,只是在表格的属性细 ...
- [Spring MVC]学习笔记--基础Servlet
Servlet是一个用Java编写的应用程序,在服务器上运行,处理请求的信息并将其发送到客户端. Servlet的客户端提出请求并获得该请求的响应. 对于所有的客户端请求,只需要创建Servlet的实 ...
- 《从零开始学Swift》学习笔记(Day 34)——静态属性是怎么回事?
原创文章,欢迎转载.转载请注明:关东升的博客 我先来设计一个类:有一个Account(银行账户)类,假设它有3个属性:amount(账户金额).interestRate(利率)和owner(账户名). ...
- zookeeper安装步骤
zookeeper安装步骤 百度搜索:zookeeper 进入后点击下载: 进入到下载的页面 英文: 中文: 进入版本列表: 进入后复制该链接, 在linux执行wget下载: wget https: ...
- 疯狂创客圈 JAVA死磕系列 总目录
无编程不创客,无案例不学习.疯狂创客圈,一大波高手正在交流.学习中! 疯狂创客圈 Java 死磕系列: [博客园 总入口] QQ群:104131248 [Java 聊天室] 实战从0开始,打造100 ...
- spring web中完成单元测试
对于在springweb总完单元测试,之前找过些资料,摸索了很久,记录下最终自己使用的方法 1,创建测试类,创建测试资源文件夹 src/test/resources/WEB_INFO/conf 将工程 ...
- [NOIP2018PJ]摆渡车
[NOIP2018PJ]摆渡车 luogu mdPJ组这么难,还好考的TG组 先按t排序 设f[i][j]表示前i个人,第i个人等j分钟的最小总等待时间 这里j是小于2m的 可以考虑最坏情况下,一个人 ...
- MySQL中InnoDB存储引擎中的哈希算法
InnoDB存储引擎使用哈希算法来对字典进行查找,其冲突机制采用链表方式,哈希函数采用除法散列方式.对于缓冲池页的哈希表来说,在缓冲池中的Page页都有一个chain指针.它指向相同哈希函数值的页的. ...
- UML初览(转)
原文:UML初览 本章使用一个简单的例子对UML中所使用的概念和视图进行初览.本章的目的是要将高层UML概念组织成一系列较小的视图和图表来可视化说明这些概念,说明如何用各种不同的概念来描述一个系统以及 ...
- Linux中权限管理之文件属性权限
chattr [+-=][选项] 文件或目录名 + 增加权限 - 删除权限 = 等于某权限 选项: i 文件设置i属性,不允许对文件进行删除.改名.添加.修改数据,相当于把整个文件锁起来了 目录设置i ...