Java NIO之SocketChannel和ServerSocketChannel
一、SocketChannel
SocketChannel是java nio 提供的用于连接两台计算机进行通信的套接字通道,把Channel去掉就剩下Socket,可见与Socket有着相似的功能。
- SocketChannel可以实现非阻塞的功能,包括连接非阻塞,IO非阻塞。
- SocketChannel与Selector多路复用器配合还可以实现基于select或者epoll的多路复用机制的网络IO模型。
- SocketChannel安全地给多个线程并发使用,但是多个线程使用该SocketChannel是互斥的。同一时间只能给一个线程使用。
- SocketChannel支持OP_READ、OP_WRITE、OP_CONNECT事件。
获取API:
//打开并返回一个SocketChannel,但是此时通道还未连接。
public static SocketChannel open()
//打开并返回一个SocketChannel ,并且进行将其连接到远程地址。
public static SocketChannel open(SocketAddress remote)
读写API:
//往套接字通道写数据ByteBuffer,用于传输到远程地址计算机上。
public abstract int write(ByteBuffer src)
//往套接字通道写数据ByteBuffer,用于传输到远程地址计算机上。
/**
* 往套接字通道写数据,用于传输到远程地址计算机上。
* srcs :ByteBuffer数组,会对里面的ByteBuffer成员顺序进行读取写入。
* offset :读取ByteBuffer数组的起始下标。
* length:读取ByteBuffer数组的元素个数。
* 与FileChannel该方法一样,详情可以参考博主另一篇FileChannel详解文章。
*/
public abstract long write(ByteBuffer[] srcs, int offset, int length)
/**
* 往套接字通道写数据,用于传输到远程地址计算机上。
* srcs :ByteBuffer数组,会对里面的ByteBuffer成员顺序进行读取写入。
*/
public final long write(ByteBuffer[] srcs)
/**
* 读取远程套接字通道传输过来的数据。
*/
public abstract int read(ByteBuffer dst)
/**
* 读取远程套接字通道传输过来的数据。
* 与FileChannel该方法一样,详情可以参考博主另一篇FileChannel详解文章。
*/
public abstract long read(ByteBuffer[] dsts, int offset, int length)
/**
* 读取远程套接字通道传输过来的数据。
* 与FileChannel该方法一样,详情可以参考博主另一篇FileChannel详解文章。
*/
public final long read(ByteBuffer[] dsts)
其他API:
//连接到远程地址
public abstract boolean connect(SocketAddress remote)
//将此套接字通道绑定到本地套接字地址上
public abstract SocketChannel bind(SocketAddress local)
//返回此套接字通道绑定的本地套接字地址
public abstract SocketAddress getLocalAddress()
//返回此套接字是否已经连接上了远程套接字
public abstract boolean isConnected();
//返回此套接字是否正在连接远程套接字。
public abstract boolean isConnectionPending();
//关闭套接字通道。
public final void close()
//返回此套接字连接到的远程套接字的地址。返回null表示未连接到远程套接字地址。
public abstract SocketAddress getRemoteAddress()
//SocketChannel支持非阻塞模式,但是默认是会阻塞的,如果要实现非阻塞,
//就要调用该方法configureBlocking(false),默认是true阻塞。
public final SelectableChannel configureBlocking(boolean block)
//返回该通道连接是否已经被关闭,返回true表示处于打开状态。
public final boolean isOpen()
//把当前channel注册到Selector上。
//sel 要注册到的selector,ops 事件类型、att共享属性。
public final SelectionKey register(Selector sel, int ops, Object att)
二、ServerSocketChannel
ServerSocketChannel的作用是在服务端复制监听来自客户端的Socket连接,类似于ServerSocket,只是他支持非阻塞和能配合SelectorSocket实现高性能的网络IO程序。
ServerSocketChannel只支持OP_ACCEPT事件。
API:
//得到一个ServerSocketChannel通道
public static ServerSocketChannel open()
//设置服务器地址
public final ServerSocketChannel bind(SocketAddress local)
//设置服务器地址,并且知道backlog,为连接等待队列大小,满了就直接拒绝连接。
public abstract ServerSocketChannel bind(SocketAddress local, int backlog)
//监听客户端连接,阻塞方法。
public abstract SocketChannel accept() throws IOException;