Netty实战 06:源码分析(一)
Netty源码分析
跟着代码的编写和运行流程来看看Netty的源码和原理,这里面包含了大量NIO的知识,所以我们要对NIO的基础知识要有掌握,不然看Netty的源码是很难受的。那么我们从哪里开始阅读源码呢,既然不知道从何下手,就从运行的例子一个一个往下看吧。
1 | public class MyServer { |
跟着代码的编写和运行流程来看看Netty的源码和原理,这里面包含了大量NIO的知识,所以我们要对NIO的基础知识要有掌握,不然看Netty的源码是很难受的。那么我们从哪里开始阅读源码呢,既然不知道从何下手,就从运行的例子一个一个往下看吧。
1 | public class MyServer { |
用git已经差不多3年了,回顾一下。
这个是Git的官网,Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git的读音为/gɪt/。
Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如 很多 Freedesktop 的项目迁移到了 Git 上。
做过web开发的人一定遇到过中文乱码的问题,一般情况下我们都是直接把所有的编码都设置成UTF-8,可是并没有真正的去理解为什么会导致乱码的问题,这里一起研究一下编码和解码究竟是怎么一回事。
这段代码很简单,就是读取一个文件的内容,然后输出到另外一个文件里面。
接下来看看如何用NIO来做一个模拟聊天,通过这个例子来更加理解NIO的使用方式,下面展示了服务端代码,用命令进行测试,然后再用NIO的方式编写客户端进行测试,对NIO的服务端和客户端的开发,都更加深入的理解。
参考:http://blog.csdn.net/lianjiww/article/details/53540145
NIO的三大组件Channel、Buffer、Selector已经讲了2个了,接着我们一起探索一下Selector。
Selector(选择器)是Java NIO的一个组件,能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道。对于操作系统来说,线程之间上下文切换的开销很大,而且每个线程都要占用系统的一些资源。因此,使用的线程越少越好。
通过调用Selector.open()方法创建一个Selector,例如:
1 | Selector selector = Selector.open(); |
之前我们用ByteBuffer.allocate()看一下源码:
1 | public static ByteBuffer allocate(int capacity) { |
HeapByteBuffer是从堆上分配的内存空间创建的Buffer,实际上JDK还提供了另外一种方式ByteBuffer.allocateDirect():
1 | public static ByteBuffer allocateDirect(int capacity) { |
java NIO中的Buffer用于和NIO通道进行交互。数据从通道读入到缓冲区,从缓冲区写入到通道中。
缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。
之前代码里面用到了ByteBuffer,实际上ByteBuffer不只是可以放byte在里面,也可以放别的类型数据,但是取出来的时候必须跟放进去的类型顺序也保持一致,否则会报错。(BufferUnderflowException)
1 | public class NioTest5 { |
“对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务。”
――《Think in Java》
下面一起来研究一下NIO的用法,先来一段示例代码:
1 | public class NioTest1 { |