首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

IO的阻塞与非阻塞、同步与异步以及Java网络IO交互方式(7)

IO的阻塞与非阻塞、同步与异步以及Java网络IO交互方式(7)

下面是简单的实现:[url=][/url]
public class NioNonBlockingSelectorTest{    Selector selector;    private ByteBuffer receivebuffer = ByteBuffer.allocate(1024);        @Test    public void testNioNonBlockingSelector()        throws Exception    {        selector = Selector.open();        SocketAddress address = new InetSocketAddress(10002);        ServerSocketChannel channel = ServerSocketChannel.open();        channel.socket().bind(address);        channel.configureBlocking(false);        channel.register(selector, SelectionKey.OP_ACCEPT);                while(true)        {            selector.select();            Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();            while (iterator.hasNext()) {                          SelectionKey selectionKey = iterator.next();                  iterator.remove();                  handleKey(selectionKey);              }          }    }        private void handleKey(SelectionKey selectionKey) throws IOException    {        ServerSocketChannel server = null;        SocketChannel client = null;        if(selectionKey.isAcceptable())        {            server = (ServerSocketChannel)selectionKey.channel();            client = server.accept();            System.out.println("客户端: " + client.socket().getRemoteSocketAddress().toString());            client.configureBlocking(false);            client.register(selector, SelectionKey.OP_READ);        }        if(selectionKey.isReadable())        {            client = (SocketChannel)selectionKey.channel();            receivebuffer.clear();              int count = client.read(receivebuffer);               if (count > 0) {                  String receiveText = new String( receivebuffer.array(),0,count);                  System.out.println("服务器端接受客户端数据--:" + receiveText);                  client.register(selector, SelectionKey.OP_READ);              }        }    }    }[url=][/url]

  Java NIO提供的非阻塞IO并不是单纯的非阻塞IO模式,而是建立在Reactor模式上的IO复用模型;在IO multiplexing Model中,对于每一个socket,一般都设置成为non-blocking,但是整个用户进程其实是一直被阻塞的。只不过进程是被select这个函数阻塞,而不是被socket IO给阻塞,所以还是属于非阻塞的IO。
  这篇文章中把这种模式归为了异步阻塞,我其实是认为这是同步非阻塞的,可能看的角度不一样。
异步IO

Java1.7中提供了异步IO的支持,暂时还没有看过,所以以后再讨论。
网络IO优化
  对于网络IO有一些基本的处理规则如下:
  1。减少交互的次数。比如增加缓存,合并请求。
  2。减少传输数据大小。比如压缩后传输、约定合理的数据协议。
  3。减少编码。比如提前将字符转化为字节再传输。
  4。根据应用场景选择合适的交互方式,同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。
就说到这里吧,感觉有点乱,有些地方还是找不到更贴切的语言来描述。
继承事业,薪火相传
返回列表