TCP/Protobuf之基础知识准备

来源:互联网 发布:淘宝耐克篮球鞋正品店 编辑:程序博客网 时间:2024/05/16 17:34

最近项目里,引入了TCP,通过protobuf,在App里来获取司机的经纬度信息。还使用到了Netty,本篇先对涉及到的基础知识做了梳理。

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.read(buffer)
    • buffer.put(byte b)

Channel的理解

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

  • FileChannel。FileChannel实例的size()方法将返回该实例所关联文件的大小。FileChannel.force()方法将通道里尚未写入磁盘的数据强制写到磁盘上。出于性能方面的考虑,操作系统会将数据缓存在内存中,所以无法保证写入到FileChannel里的数据一定会即时写到磁盘上。要保证这一点,需要调用force()方法。
  • DatagramChannel,面向UDP
  • SocketChannel
  • ServerSocketChannel

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

Selector的理解

Selctor的建立

Selector selector = Selector.open();

SelectionKey对象
  • interest集合是你所选择的感兴趣的事件集合。int interestSet = selectionKey.interestOps();
    有以下几个:

    1. SelectionKey.OP_CONNECT
    2. SelectionKey.OP_ACCEPT
    3. SelectionKey.OP_READ
    4. SelectionKey.OP_WRITE
  • ready集合是通道已经准备就绪的操作的集合。int readySet = selectionKey.readyOps();。

    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之间的主要差别

  • IO 面向流,阻塞IO
  • NIO,面向缓冲, 非阻塞IO,选择器

Java IO 管道

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

1 0
原创粉丝点击