Java NIO SocketChannel
Java NIO SocketChannel是连接到TCP网络套接字的通道。它与Java NIO等效于Java Networking的Sockets。有两种SocketChannel创建方法:
- 您打开一个SocketChannel并连接到Internet上某个服务器。
- SocketChannel可以当传入连接到达一个被创建ServerSocketChannel。
1 打开一个SocketChannel
这是打开方式SocketChannel:
SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress("https://www.xnip.cn", 80));
2 关闭一个SocketChannel
您SocketChannel可以通过调用SocketChannel.close()方法来关闭使用后。这是完成的方式:
socketChannel.close();
3 从SocketChannel读取
要从中读取数据,SocketChannel请调用其中一种read()方法。这是一个例子:
ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = socketChannel.read(buf);
首先Buffer分配a。从SocketChannel读取的数据被读入Buffer。
其次,该SocketChannel.read()方法被调用。此方法读取从数据SocketChannel 进入Buffer。在int由返回的read()方法告诉了多少字节威腾进入Buffer。如果返回-1,则到达流的末尾(连接已关闭)。
4 写入SocketChannel
SocketChannel使用SocketChannel.write() 方法 将数据写入到a中,该方法采用aBuffer作为参数。这是一个例子:
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.write()在while循环中如何调用该方法。无法保证该write()方法将写入多少字节SocketChannel。因此,我们重复write()调用直到Buffer没有其他字节要写入为止。
5 非阻塞模式
您可以将设为SocketChannel非阻止模式。当你这样做,你可以调用 connect(),read()并write()在异步模式。
5.1 connect()方法
如果处于SocketChannel非阻塞模式,并且您调用connect(),则该方法可能会在建立连接之前返回。要确定是否建立连接,可以调用finishConnect()方法,如下所示:
socketChannel.configureBlocking(false);
socketChannel.connect(new InetSocketAddress("http://jenkov.com", 80));
while(! socketChannel.finishConnect() ){
//wait, or do something else...
}
5.2 write()方法
在非阻塞模式下,该write()方法可能无需编写任何内容即可返回。因此,您需要write()循环调用该方法。但是,由于在前面的编写示例中已经完成了此操作,因此此处无需做任何其他操作。
5.3 read()方法
在非阻塞模式下,该read()方法可以返回而根本不读取任何数据。因此,您需要注意return int,它告诉您读取了多少字节。
5.4 带选择器的非阻塞模式
的的非阻塞模式与SocketChannel的搭配效果更好Selector。通过注册一个或一个以上SocketChannel的有Selector,你可以问Selector 对于那些准备读通道,写等如何使用Selector的具有SocketChannel的更详细,在本教程后面的文本解释。