我是靠谱客的博主 现代乌冬面,最近开发中收集的这篇文章主要介绍NIO 学习(五) SocketChannel,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

SocketChannel是NIO中连接到TCP网络套接字的信道,创建的两种情况

1. 在客户端,打开一个socketchannel并连接到某台服务器上

2. 在服务器,一个新的连接到达SocketServerChannel,会创建一个SocketChannel

打开一个SocketChannel

SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("127.0.0.1", 23000));
关闭SocketChannel   socketChannel.close()

从SocketChannel读取数据

ByteBuffer byteBuffer = ByteBuffer.allocate(38);
socketChannel.read(byteBuffer);
socketchannel的read方法,将通道里面的数据put到buffer中,read方法返回的int值,表示放到buffer中的字节数,如果返回-1,表示到达流末尾

信道的read方法隐式调用了缓冲区的put方法,调用read方法钱,需要调用缓冲区的clear方法

写入SocketChannel

String str = "data for testing";
byteBuffer.clear();
byteBuffer.put(str.getBytes());
			
byteBuffer.flip();
while(byteBuffer.hasRemaining()){
	socketChannel.write(byteBuffer);
}
write的方法的调用是在一个while循环中,write方法无法保证写入多少字节到信道中,hasRemaing检查缓冲区区是否还有数据,while循环直到缓冲区的数据 全部写入到信道中

信道的write方法隐式调用了缓冲区的get方法,在调用信道的write方法前,需要先调用缓冲区的flip方法

非阻塞模式non-blocking mode

socketChannel.configureBlocking(false);
调用configureBlocking ,false设置为non-blocking mode(非阻塞模式),true 设置为blocking mode 阻塞模式

非阻塞模式下能异步调用connect,write,read方法


non-blocking-mode connect

非阻塞模式下调用connect方法,可能在连接没有建立的时候,就返回了,可以使用finishConnect方法检查

SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("127.0.0.1", 23000));
socketChannel.configureBlocking(false);
while(!socketChannel.finishConnect()){
	//没有连接上  do something else
}

non-blocking-mode write

非阻塞模式下调用 write方法,可能在没有写出任何字节就返回了,需要在while循环中检查

String str = "data for testing";
byteBuffer.clear();
byteBuffer.put(str.getBytes());
			
byteBuffer.flip();
while(byteBuffer.hasRemaining()){
	socketChannel.write(byteBuffer);
}
non-blocking-mode read

非阻塞模式下调用read方法,可能没有读取到任何字节,需要关注read的返回值(返回-1,到达流末尾)


non-blocking-mode 非阻塞模式存在的目的和选择器搭配,多个socketChannel注册到了selector上,selector选择器就能选择其中一个channel进行write,read操作,其他的channel也不会因为阻塞浪费资源

参照:http://ifeve.com/socket-channel/  加上自己的理解

最后

以上就是现代乌冬面为你收集整理的NIO 学习(五) SocketChannel的全部内容,希望文章能够帮你解决NIO 学习(五) SocketChannel所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部