SocketChannel用法
Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道
SocketChannel支持设定参数
SO_SNDBUF 套接字发送缓冲区大小
SO_RCVBUF 套接字接收缓冲区大小
SO_KEEPALIVE 保护连接
O_REUSEADDR 复用地址
SO_LINGER 有数据传输时延缓关闭Channel(非阻塞模式下有用)
TCP_NODELAY 禁用Nagle算法
(1)创建SocketChannel
第一种方式:
SocketChannel socketChannel = SocketChannel.open(new
InetSocketAddress("www.baidu.com",80));
第一种方式:
SocketChannel socketChannel = SocketChannel.open;
socketChannel.connect(new InetSocketAddress("www.baidu.com",80));
直接使用有参open api或者使用无参open api,但是在无参open只是创建了一个SocketChannel对象,并没有进行实质的tcp连接
(2)连接校验
socketChannel.isOpen(); //测试SocketChannel是否为open状态
socketChannel.isConnected(); //测试SocketChannel是否被连接
socketChannel.isConnectionPending(); //测试SocketChannel是否正在连接
socketChannel.finishConnect(); //校验正在进行套接字连接额SocketChannel是否已经完成连接
(3)读写模式
SocketChannel支持阻塞和非阻塞模式:
socketChannel.configureBlocking(false);
false表示阻塞,true表示非阻塞
(4)读写
SocketChannel socketChannel = SocketChannel.open(new
InetSocketAddress("www.baidu.com",80));
ByteBuffer byteBuffer = ByteBuffer.allocate(16);
socketChannel.read(byteBuffer);
socketChannel.close();
System.out.println("over");
以上为阻塞式读,当执行到read出,线程将阻塞,控制台将无法打印over
SocketChannel socketChannel = SocketChannel.open(new
InetSocketAddress("www.baidu.com",80));
socketChannel.configureBlocking(false);
ByteBuffer byteBuffer = ByteBuffer.allocate(16);
socketChannel.read(byteBuffer);
socketChannel.close();
System.out.println("over");
以上为非阻塞式读,控制台将打印over
读写都是面向缓冲区,这个读写方式与前文中的FileChannel相同
(5)设置和读取参数
socketChannel.setOption(StandardSocketOptions.SO_KEEPALIVE,
Boolean.TRUE).setOption(StandardSocketOptions.TCP_NODELAY,Boolean.TRUE);
通过setOptions方法可以设置socket套接字的相关参数
socketChannel.getOption(StandardSocketOptions.SO_KEEPALIVE);
socketChannel.getOption(StandardSocketOptions.SO_RCVBUF);
可以通过getOption获取相关参数的值.如默认的接收缓冲区大小为8192byte.
SocketChannel还支持多路复用,但是多路复用在后续内容中会介绍到.