SocketChannel用法

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还支持多路复用,但是多路复用在后续内容中会介绍到.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值