我是靠谱客的博主 舒心衬衫,最近开发中收集的这篇文章主要介绍SocketChannel用法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还支持多路复用,但是多路复用在后续内容中会介绍到.

最后

以上就是舒心衬衫为你收集整理的SocketChannel用法SocketChannel用法的全部内容,希望文章能够帮你解决SocketChannel用法SocketChannel用法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部