TCP/Protobuf基础知识准备

2016-06-27  本文已影响452人  sugaryaruan

Socket套接字之间的连接过程分为三个步骤:

Java NIO的通道类似流,但又有些不同:

  1. 流只是在一个方向上移动(一个流必须是 InputStream 或者 OutputStream 的子类),而通道可以用于读、写或者同时用于读写,是全双工的。
  2. 通道可以异步地读写。
  3. 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。

Buffer的理解

  1. position ,limit,capacity机制,读和写两种
  2. Buffer与Channel之间的读和写操作,分为一对一,一对多,多合一,三种方式。
  3. buffer.flip()切换到读模式。clear()方法会清空整个缓冲区。compact()方法只会清除已经读过的数据。
  4. buffer.marker(),buffer.reset()连用。通过调用Buffer.mark()方法,可以标记Buffer中的一个特定position。之后可以通过调用Buffer.reset()方法恢复到这个position。
  5. 写入Buffer(读取buffer类似)

Channel的理解

这些是Java NIO中最重要的通道的实现:

默认实现是阻塞式的,需要异步非阻塞式的,调用方法socketChannel.configureBlocking(false)

Selector的理解

Selctor的建立

Selector selector = Selector.open();

SelectionKey对象
  1. SelectionKey.OP_CONNECT
  2. SelectionKey.OP_ACCEPT
  3. SelectionKey.OP_READ
  4. SelectionKey.OP_WRITE
  1. selectionKey.isAcceptable();
  2. selectionKey.isConnectable();
  3. selectionKey.isReadable();
  4. selectionKey.isWritable();
从SelectionKey访问Channel和Selector很简单。如下:
  1. Channel channel = selectionKey.channel();
  2. Selector selector = selectionKey.selector();

Pipe的理解

Pipe有一个source通道和一个sink通道。

创建

1 Pipe pipe = Pipe.open();

sink通道创建

Pipe.SinkChannel sinkChannel = pipe.sink();

source通道

Pipe.SourceChannel sourceChannel = pipe.source();

Java NIO和IO的主要区别

下表总结了Java NIO和IO之间的主要差别

Java IO 管道

一个线程通过PipedOutputStream写入的数据可以被另一个线程通过相关联的PipedInputStream读取出来。

上一篇下一篇

猜你喜欢

热点阅读