netty concepts
2015-07-30 16:40
465 查看
这里主要想大致地理一下几个主要接口之间的关系,一旦理解,就变得直观,不然总是云里雾里。
下面是我的一个netty client的一段不完整的代码,在我电脑上是可以跑的,只是还有GZIP没有处理,看到的是乱码。
要启动一个网络客户端应用,我们应该为BootStrap配置些什么呢?
(1) 指定server端的IP和port,这样BootStrap就知道了数据要从什么地方拿。用的是remoteAddress方法。
(2) 指定是用哪种传输的通道,比如这里我们是用的NioSocketChannel,这样BootStrap就知道了要用Buffer去一批一批地拿数据,每拿到一批就触发一个事件。用的是channel方法。
(3) 注册事件组, register event loop with channel。这样我们在那个通道上就可以获得很多events。用的是group方法。
(4) 指定事件如何处理。用的是handler方法。对于流数据的处理,我们可能需要像流水线一样处理,于是netty抽象了ChannelPipeline接口,一个ChannelPipeline就包含了多个ChannelHandler,而怎么把这些ChannelHandler放到一个ChannelPipeline下呢,就用的是ChannelInitializer。BootStrap的handler方法实际不是指定一个ChannelHandler,而是一个ChannelHandler的集合。这样,我们看上面的代码就比较清晰了。
Reference:
[1] Netty in Action.
下面是我的一个netty client的一段不完整的代码,在我电脑上是可以跑的,只是还有GZIP没有处理,看到的是乱码。
public void start() throws Exception { EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group).channel(NioSocketChannel.class) .remoteAddress(new InetSocketAddress(host, port)) .handler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter())); // TODO GZIP and Data Length Session pipeline.addLast("decoder", new StringDecoder()); pipeline.addLast("encoder", new StringEncoder()); pipeline.addLast("handler", new FeedClientHandler()); } }); ChannelFuture future = bootstrap.connect().sync(); future.channel().writeAndFlush(login); Thread.sleep(60000); // todo } finally { group.shutdownGracefully(); } }先说说BootStrap,这个主要是抽象了process of configuring。
要启动一个网络客户端应用,我们应该为BootStrap配置些什么呢?
(1) 指定server端的IP和port,这样BootStrap就知道了数据要从什么地方拿。用的是remoteAddress方法。
(2) 指定是用哪种传输的通道,比如这里我们是用的NioSocketChannel,这样BootStrap就知道了要用Buffer去一批一批地拿数据,每拿到一批就触发一个事件。用的是channel方法。
(3) 注册事件组, register event loop with channel。这样我们在那个通道上就可以获得很多events。用的是group方法。
(4) 指定事件如何处理。用的是handler方法。对于流数据的处理,我们可能需要像流水线一样处理,于是netty抽象了ChannelPipeline接口,一个ChannelPipeline就包含了多个ChannelHandler,而怎么把这些ChannelHandler放到一个ChannelPipeline下呢,就用的是ChannelInitializer。BootStrap的handler方法实际不是指定一个ChannelHandler,而是一个ChannelHandler的集合。这样,我们看上面的代码就比较清晰了。
Reference:
[1] Netty in Action.
相关文章推荐
- 技术教程网址
- CentOS安装配置JDK环境
- 【Android应用开发技术:数据存储】数据库
- 牛顿迭代法求解多元高阶方程组
- FastCgi与PHP-fpm之间是个什么样的关系
- hdu 4028 2011上海赛区网络赛H dp+map离散
- Swift开发教程--字符串的操作
- WinXP、Win7脚本自动加域及用户资料迁移
- C#读取XML流数据
- python如何实现excel数据添加到mongodb
- 判断手机是否有root权限
- CIO客观评价SAP和用友的差异
- 【Android应用开发技术:文件读写】Android文件系统
- 【noip】noip2008 wikioi1169传纸条
- OpenCV五学习: 如何使用命令来启动或关闭OpenCV的CPU指令系统CV_SSE2,CV_SSSE4和其他优化
- Windows系统环境变量列表
- Hdu 1087
- panabit自动分析域名并添加解析后的IP
- 互联网金融乱弹2:互联网金融Webservice接口开发实践
- GTK进阶学习:绘图事件