Java网络编程之SocketChannel和ServerSocketChannel

SocketChannel是Java NIO中用于网络通信的重要组件,提供非阻塞连接和读写操作。它可以配合Selector实现多路复用,提高并发性能。SocketChannel支持OP_READ、OP_WRITE、OP_CONNECT事件,允许安全的多线程并发访问,但同一时间仅允许一个线程使用。常用API包括打开连接、读写数据、配置非阻塞模式等。ServerSocketChannel则用于服务端监听客户端连接,支持OP_ACCEPT事件。

SocketChannel

  1. SocketChannel是java nio 提供的用于连接两台计算机进行通信的套接字通道,把Channel去掉就剩下Socket,可见与Socket有着相似的功能。
  2. SocketChannel可以实现非阻塞的功能,包括连接非阻塞,IO非阻塞。
  3. SocketChannel与Selector多路复用器配合还可以实现基于select或者epoll的多路复用机制的网络IO模型。
  4. SocketChannel安全地给多个线程并发使用,但是多个线程使用该SocketChannel是互斥的。同一时间只能给一个线程使用。
  5. SocketChannel支持OP_READ、OP_WRITE、OP_CONNECT事件。
常见API
获取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;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值