Netty 中文教程 (二) Hello World !详解
来源:互联网 发布:sql中values什么意思 编辑:程序博客网 时间:2024/05/23 17:27
上一篇文章,笔者提供了一个Hello World 的Netty示例。
时间过去了这么久,准备解释一下示例代码。
1.HelloServer 详解
HelloServer首先定义了一个静态终态的变量---服务端绑定端口7878。至于为什么是这个7878端口,纯粹是笔者个人喜好。大家可以按照自己的习惯选择端口。当然了。常用的几个端口(例如:80,8080,843(Flash及Silverlight策略文件请求端口等等),3306(Mysql数据库占用端口))最好就不要占用了,避免一些奇怪的问题。
HelloServer类里面的代码并不多。只有一个main函数,加上内部短短的几行代码。
Main函数开始的位置定义了两个工作线程,一个命名为WorkerGroup,另一个命名为BossGroup。都是实例化NioEventLoopGroup。这一点和3.x版本中基本思路是一致的。Worker线程用于管理线程为Boss线程服务。
讲到这里需要解释一下EventLoopGroup,它是4.x版本提出来的一个新概念。类似于3.x版本中的线程。用于管理Channel连接的。在main函数的结尾就用到了EventLoopGroup提供的便捷的方法,shutdownGraceFully(),翻译为中文就是优雅的全部关闭。感觉是不是很有意思。作者居然会如此可爱的命名了这样一个函数。查看相应的源代码。我们可以在DefaultEventExecutorGroup的父类MultithreadEventExecutorGroup中看到它的实现代码。关闭了全部EventExecutor数组child里面子元素。相比于3.x版本这是一个比较重大的改动。开发者可以很轻松的全部关闭,而不需要担心出现内存泄露。
在try里面实例化一个ServerBootstrap b。设置group。设置channel为NioServerSocketChannel。
设置childHandler,在这里使用实例化一个HelloServerInitializer类来实现,继承ChannelInitializer<SocketChannel>。内部的代码我们可以在前文的注视中大致了解一下,主要作用是设置相关的字节解码编码器,和代码处理逻辑。Handler是Netty包里面占很大一个比例。可见其的作用和用途。Handler涉及很多领域。HTTP,UDP,Socket,WebSocket等等。详细的部分在本章的第三节解释。
设置好Handler绑定端口7878,并调用函数sync(),监听端口(等待客户端连接和发送消息)。并监听端口关闭(为了防止线程停止)。
最后finally我们要优雅的全部关闭服务端。^_^
2.HelloClient详解
相比于服务端的代码。客户端要精简一些。
客户端仅仅只需要一个worker的EventLoopGroup。其次是类似于ServerBootstrap的HandlerInitializer。
唯一不同的可能就是客户端的connect方法。服务端的绑定并监听端口,客户端是连接指定的地址。Sync().channel()是为了返回这个连接服务端的channel,并用于后面代码的调用。
BufferedReader 这个是用于控制台输入的。不做详细的解释了就。大家都懂的。
当用户输入一行内容并回车之后。循环的读取每一行内容。然后使用writeAndFlush向服务端发送消息。
3.HandlerInitializer详解
Handler在Netty中是一个比较重要的概念。有着相当重要的作用。相比于Netty的底层。我们接触更多的应该是他的Handler。在这里我将它剥离出来单独解释。
ServerHandlerInitializer继承与ChannelInitializer<SocketChannel>需要我们实现一个initChannel()方法。我们定义的handler就是写在这里面。
在最开始的地方定义了一个DelimiterBasedFrameDecoder。按直接翻译就是基于分隔符的帧解码器。再一次感觉框架的作者的命名,好直接好简单。详细的内容我们在后面的文章中在为大家详细的解释。目前大家知道他是以分隔符为分割标准的解码器就好了。
也许有人会问分隔符是什么?我只能 !*_* :“纳尼 !!”。分隔符其实就是“\n”我们在学习C语言的时候最常用的的也许就是这个分隔符了吧。
下面的则是StringDecoder 和StringEncoder。字符串解码器和字符串编码器。
最后面则是我们自己的逻辑。服务/客户端逻辑是在消息解码之后处理的。然后服务/客户端返回相关消息则是需要对消息进行相对应的编码。最终才是以二进制数据流的形势发送给服务/客户端的。
内容暂时就写到这里。O(∩_∩)O哈哈~。后面的东西慢慢为大家完善。
假如有甚么不正确的地方,敬请谅解。求大神指正。
- Netty 中文教程 (二) Hello World !详解
- Netty 中文教程 (二) Hello World !详解
- Netty 中文教程 (二) Hello World !详解
- 《Netty学习》(二)Hello World
- Java NIO框架Netty教程(十七) Netty4 Hello world
- netty学习(二)——Hello world!
- Golang教程:(二)Hello World
- Netty4.x中文教程系列(二) Hello World !
- Netty构建游戏服务器(二)--Hello World
- Hello World 详解@GTK+ 2.0 中文教程连载
- GitHub Hello world中文教程
- netty hello world
- XNA Build入门中文教程-Hello world
- Netty4.x中文教程系列 Hello World
- 自己动手写操作系统二(编写内核Hello World 教程)
- Direct2D教程(二)来看D2D世界中的Hello,World
- Direct2D教程(二)来看D2D世界中的Hello,World
- javaSE(hello,world)(二)
- ViewPager 详解(一)---基本入门
- poj 1050 To The Max
- c#试题(一)
- UVA 12168 Cat vs. Dog(最大独立集)
- jsp到后台乱码问题的解决方案
- Netty 中文教程 (二) Hello World !详解
- torch7跑mnist例子出现No LuaRocks module found for weight-init问题
- Node核心模块之Events
- git使用总结
- client
- Python零基础入门一
- hibernate cascade,inverse和lazy的用法
- C++ primer 二十 map、sset关联容器
- 深度学习 4. MatConvNet 相关函数解释说明,MatConvNet 细节理解,MatConvNet 代码理解