java TCP/IP Socket编程-----NIO--TCP信道-----笔记11

来源:互联网 发布:淘宝哪家mcm高仿比较好 编辑:程序博客网 时间:2024/04/26 18:23

概述:

流信道有两个变体:SocketChannel和ServerSocketChannel。像其对应的Socket一样,SocketChannel是相互连接的终端进行通信的信道。

1、SocketChannel 创建,连接和关闭

static SocketChannel open(SocketAddress remote) 创建一个实例

static SocketChannel open()

boolean connect(SocketAddress remote) 连接

boolean isConnected() 是否连接上

void close() 关闭

boolean isOpen() 是否打开

Socket socket() 获取套接字


ServerSocketChannel:创建,接受和关闭

static ServerSocketChannel open()

ServerSocket socket()

SocketChannel accept()

void close()

boolean isOpen()


SocketChannel ,ServerSocketChannel 设置阻塞行为

SelectableChannel configureBlocking(boolean block)

boolean isBlocking();


SocketChannel:测试连接性

boolean finishConnect()

boolean isConnected()

boolean isConnectionPending()

2、Selector 详解

Selector:创建和关闭

static Selector open()

boolean isOpen()

void close()

我们已经知道,每个选择器都有一组与之关联的信道,选择器对这些信道上"感兴趣的"I/O操作进行监听。Selector与Channel之间的关联由一个SelectionKey实例表示。(注意,一个信道可以注册多个Selector实例,因此可以有多个关联的SelectionKey实例)SelectionKey维护了一个信道上感兴趣的操作类型信息,并将这些信息存放在一个int型的位图(bitmap)中,该int型数据的每一位都有相应的含义。
SelectionKey类中的常量定义了信道上可能感兴趣的操作类型,每个这种常量都是只有一位设置为1的位掩码(bitmask)

SelectionKey 兴趣操作集

static int OP_ACCEPT

static int OP_CONNECT

static int OP_READ

static int OP_WRITE

int interestOps()

SelectionKey interestOps(int ops)


SocketChannel, ServerSocketChannel 注册Selector

SelectionKey register(Selector sel, int ops)

SelectionKey register(Selector sel, int ops, Object attachment)

int validOps()

boolean isRegistered()

SelectionKey keyFor(Selector sel)


SelectionKey 获取和取消

Selector selector()

SelectableChannel channel()

void cancel()


Selector 等待信道准备就绪

int select()

int select(long timeout)

int selectNow()

Selector wakeup()


select()方法用于从已经注册的信道中返回在感兴趣的I/O操作集上准备就绪的信道总数。(例如,兴趣操作集中包含OP_READ的信道有数据可读,或包含OP_ACCEPT的信道有连接请求待接受。)以上三个select方法的惟一区别在于它们的阻塞行为。无参数的select方法会阻塞等待,直到至少有一个注册信道中有感兴趣的操作准备就绪,或有别的线程调用了该选择器的wakeup()方法(这种情况下select方法将返回0)。以超时时长作为参数的select方法也会阻塞等待,直到至少有一个信道准备就绪,或等待时间超过了指定的毫秒数(正数),或者有另一个线程调用其wakeup()方法。selectNow()方法是一个非阻塞版本:它总是立即返回,如果没有信道准备就绪,则返回0。wakeup()方法可以使当前阻塞(也就是说在另一个线程中阻塞)的任何一种select方法立即返回;如果当前没有select方法阻塞,下一次调用这三种方法的任何一个都将立即返回。

Selector:获取键集

Set<SelectionKey> keys()

Set<SelectionKey> selectedKeys()

SelectionKey:查找就绪的IO操作

int readyOps()

boolean isAcceptable()

boolean isConnectable()

boolean isReadable()

boolean isValid()

boolean isWritable()

3.信道信件:

SelectionKey: 查找准备就绪的IO操作

Object attach(Object obj)

Object attachment()

Selector小结
总的来说,使用Selector的步骤如下:
I.创建一个Selector实例。
II.将其注册到各种信道,指定每个信道上感兴趣的I/O操作。
III.重复执行:
1.调用一种select方法。
2.获取选取的键列表。
3.对于已选键集中的每个键,
a.获取信道,并从键中获取附件(如果合适的话)
b.确定准备就绪的操作并执行。如果是accept操作,将接受的信道设置为非阻塞模式,并将其与选择器注册。
c.如果需要,修改键的兴趣操作集
d.从已选键集中移除键

4.数据报(UDP)信道

DatagramChannel:创建,连接和关闭

static DatagramChannel open()

boolean isOpen()

DatagramSocket socket() 

void close()


DatagramChannel:发送和接收数据

int send(ByteBuffer src, SocketAddress target)

SocketAddress receive(ByteBuffer dst)

send()方法用于创建一个包含了给定ByteBuffer中的数据的数据报文,并将其发送到目的地址指定的SocketAddress上。receive()方法用于将接收到的数据报文存入指定缓冲区并返回发送者的地址。重要提示:如果缓冲区的剩余空间小于数据报文中的数据大小,多余的数据将毫无提示地丢弃。


DatagramChannel 设置阻塞行为和使用选择器

SelectableChannel configureBlocking(boolean block)

boolean isBlocking()

SelectionKey register(Selector sel, int ops)

SelectionKey register(Selector sel, int ops, Object attachment)

boolean isRegistered()

int validOps()

SelectionKey keyFor(Selector sel)

总结:好多类API

原创粉丝点击