`
jimmee
  • 浏览: 531035 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

最简单的nio server编程

阅读更多

原文地址: 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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics