标签:两种 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 socketChannel = SocketChannel.open(); socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));
socketChannel.close();
ByteBuffer buf = ByteBuffer.allocate(48); int bytesRead = socketChannel.read(buf);
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); }
你可以将SocketChannel设置为非阻塞模式。在非阻塞模式下,connect、read、write操作都变成了异步
非阻塞模式下,connect方法变成异步。你需要主动去判断连接是否完成
socketChannel.configureBlocking(false); socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80)); while(! socketChannel.finishConnect() ){ //wait, or do something else... }
非阻塞模式下,write方法直接返回。因此,你需要在循环中不断调用write方法。但是在上面的write示例中本身就是循环调用,所以其实写法没有不同
非阻塞模式下,read方法直接返回,这时候可能并未读取到任何数据。因此,你需要注意read方法返回值,从而判断当前有没有读取到数据。
非阻塞模式的SocketChannel和Selector搭配使用非常方便。通过将SocketChannel注册到Selector中,当SocketChannel可用的时候通过事件响应异步处理
标签:两种 pen www open color 异步 blog com sele
原文地址:https://www.cnblogs.com/lay2017/p/12906661.html