九、Java NIO SocketChannel
2021-01-19 17:12
标签:两种 pen www open color 异步 blog com sele https://www.cnblogs.com/lay2017/p/12901123.html SocketChannel表示一个连接到TCP通道的Socket上。有两种方式可以创建SocketChannel 1.你可以直接open一个SocketChannel,然后connect 2.当ServerSocketChannel接收到连接的时候 你可以将SocketChannel设置为非阻塞模式。在非阻塞模式下,connect、read、write操作都变成了异步 非阻塞模式下,connect方法变成异步。你需要主动去判断连接是否完成 非阻塞模式下,write方法直接返回。因此,你需要在循环中不断调用write方法。但是在上面的write示例中本身就是循环调用,所以其实写法没有不同 非阻塞模式下,read方法直接返回,这时候可能并未读取到任何数据。因此,你需要注意read方法返回值,从而判断当前有没有读取到数据。 非阻塞模式的SocketChannel和Selector搭配使用非常方便。通过将SocketChannel注册到Selector中,当SocketChannel可用的时候通过事件响应异步处理 九、Java NIO SocketChannel 标签:两种 pen www open color 异步 blog com sele 原文地址:https://www.cnblogs.com/lay2017/p/12906661.html所有文章
正文
open一个SocketChannel
SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));
close一个SocketChannel
socketChannel.close();
从SocketChannel读取数据
ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = socketChannel.read(buf);
写入数据到SocketChannel
String newData = "New String to write to file..." + System.currentTimeMillis();
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());
buf.flip();
while(buf.hasRemaining()) {
channel.write(buf);
}
非阻塞模式
connect
socketChannel.configureBlocking(false);
socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));
while(! socketChannel.finishConnect() ){
//wait, or do something else...
}
write
read
非阻塞模式下的选择器
上一篇:(12) WPF 对话框控件
文章标题:九、Java NIO SocketChannel
文章链接:http://soscw.com/index.php/essay/44146.html