Board logo

标题: IO的阻塞与非阻塞、同步与异步以及Java网络IO交互方式(7) [打印本页]

作者: yuyang911220    时间: 2015-11-21 16:55     标题: 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。根据应用场景选择合适的交互方式,同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。
就说到这里吧,感觉有点乱,有些地方还是找不到更贴切的语言来描述。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0