File tree Expand file tree Collapse file tree 3 files changed +10
-8
lines changed Expand file tree Collapse file tree 3 files changed +10
-8
lines changed Original file line number Diff line number Diff line change 1
1
Channel与Pipeline
2
2
--------
3
- Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Netty中Channel部分的实现机制 。为了避免枯燥,借用一下《盗梦空间》的“梦境”概念,希望大家喜欢。
3
+ Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制 。为了避免枯燥,借用一下《盗梦空间》的“梦境”概念,希望大家喜欢。
4
4
5
5
## 一层梦境:Channel实现概览
6
6
@@ -60,7 +60,7 @@ Netty官方的javadoc里有一张图(`ChannelPipeline`接口里),非常形象
60
60
61
61
前面提到了,` ChannelPipeline ` 接口的两个重要的方法:` sendUpstream(ChannelEvent e) ` 和` sendDownstream(ChannelEvent e) ` 。** 所有事件** 的发起都是基于这两个方法进行的。` Channels ` 类有一系列` fireChannelBound ` 之类的` fireXXXX ` 方法,其实都是对这两个方法的facade包装。
62
62
63
- 下面来看一下这两个方法的实现(对代码做了一些简化,保留主逻辑):
63
+ 下面来看一下这两个方法的实现。先看sendUpstream (对代码做了一些简化,保留主逻辑):
64
64
65
65
``` java
66
66
public void sendUpstream(ChannelEvent e) {
@@ -126,7 +126,7 @@ DefaultChannelPipeline里还有些机制,像添加/删除/替换Handler,以
126
126
127
127
![ universal API] [ 3 ]
128
128
129
- 理清了ChannelPipeline的主流程,我们对Channel部分的大致结构算是弄清楚了。可是到了这里,我们依然对一个连接具体怎么处理没有什么概念,下篇文章,我们会分析一下,Netty中一个连接的生命周期,在连接的建立、数据的传输过程中,具体做了什么事情 。
129
+ 理清了ChannelPipeline的主流程,我们对Channel部分的大致结构算是弄清楚了。可是到了这里,我们依然对一个连接具体怎么处理没有什么概念,下篇文章,我们会分析一下,在Netty中,捷径如何处理连接的建立、数据的传输这些事情 。
130
130
131
131
PS: Pipeline这部分拖了两个月,终于写完了。中间写的实在缓慢,写个高质量(至少是自认为吧!)的文章不容易,但是仍不忍心这部分就此烂尾。中间参考了一些优秀的文章,还自己使用netty开发了一些应用。以后这类文章,还是要集中时间来写完好了。
132
132
Original file line number Diff line number Diff line change @@ -5,19 +5,21 @@ Channel与NIO
5
5
6
6
## 一、Socket的生命周期
7
7
8
- 在Java里,我们使用 [ Socket ] ( http://en.wikipedia.org/wiki/Network_socket ) 编程方式处理网络IO。在OIO中有 ` ServerSocket ` 、 ` Socket ` 和 ` DatagramSocket ` ,前两个对应TCP连接,后一个对应UDP报文。在NIO中,我们改用了 ` ServerSocketChannel ` 、 ` SocketChannel ` 和 ` DatagramChannel ` ,并拥有了基于Selector的通知机制,但是Socket使用的方式可以说没有什么变化 。
8
+ 在TCP/IP协议中,网络传输层分为TCP和UDP两种。UDP没有连接的概念,双方都是对等的,只存在send&receive,相对简单。对于TCP,乃至于所有有连接的传输层协议,都可以简单的概括为三个步骤:建立连接、传输、关闭连接 。
9
9
10
- UDP没有连接的概念,双方都是对等的,只存在send&receive,相对简单。而对于TCP socket,则需要经过建立连接的过程 。
10
+ 在Java里,无论是OIO还是NIO,都是使用 [ Socket ] ( http://en.wikipedia.org/wiki/Network_socket ) 编程方式。在OIO中有 ` ServerSocket ` 、 ` Socket ` 和 ` DatagramSocket ` ,前两个对应TCP,后一个对应UDP。在NIO中,我们改用了 ` ServerSocketChannel ` 、 ` SocketChannel ` 和 ` DatagramChannel ` ,并拥有了基于Selector的通知机制,但是Socket使用的方式可以说没有什么变化 。
11
11
12
- 在建立连接之前,存在两个角色:Server和Client。
12
+ 而对于TCP socket,则需要经过建立连接的过程。
13
+
14
+ 在建立连接之前,存在两个角色:ServerSocketChannel和SocketChannel。
13
15
14
16
Client端的流程是这样:
15
17
16
- Open=>Connect
18
+ open()=>connect()
17
19
18
20
Server端的流程是这样:
19
21
20
- Open=>Bind =>(Listen )=>Accept
22
+ open()=>bind() =>(listen )=>accept()
21
23
22
24
建立连接之后,C/S双方都会拿到一个对等的` SocketChannel ` ,通过它可以进行` read() ` /` write() ` 等数据交互,并可以使用` close() ` 关闭连接。
23
25
You can’t perform that action at this time.
0 commit comments