原文地址: http://rox-xmlrpc.sourceforge.net/niotut/
1. Use a single selecting thread
使用单线程处理selectors, selectors are threadsafe their key sets are not
2. Modify the selector from the selecting thread only
从选择线程里修改selector
3. Set OP_WRITE only when you have data ready
仅仅准备好写数据的时候, 才设置OP_WRITE
4. Alternate between OP_READ and OP_WRITE
在OP_READ和OP_WRITE之间交替处理
流程:
1. Server端:
(1) 创建一个包含Selector的线程
(2) 初始化Selector, bind服务器端的channel, 此channel监听OP_ACCEPT
(3) 当有链接进程来, 创建channel, selector上监听此chanel的OP_READ
(4) channel上有数据进来后, 读取数据, 扔给业务线程处理此channel的数据, 最后, 回写数据时,
将数据传递给Selector线程, 特别注意, 回写时, 要wakeup() selector, 避免一直在OP_ACCEPT和
OP_READ上等待
(5) selector上要写数据的channel, 改为监听OP_WRITE
(6) 向channel里写数据, 若数据写完, 则改监听为OP_READ
2. Client端:
(1) 创建一个Selector
(2) 发送数据之前, 创建到服务器段的链接, 注册并添加OP_CONNECT的监听, 同时先缓存要写的数据, selector要被wakeup, 方便处理建立链接的监听
(3) 若简历链接成功, 完成连接建立, 改为监听OP_WRITE
(4) 当要发送的数据完成后, 改监听为OP_READ
(5) 读取数据, 并处理
只要不是selector的select后续的处理, 其他异步的写数据, client建立链接等, 均需要调用selector的wakeup