当前位置: 首页 > 教程 > Java NIO >

Java NIO SocketChannel

精华
小牛编辑
178浏览
2023-03-14

Java NIO SocketChannel是连接到TCP网络套接字的通道。它与Java NIO等效于Java Networking的Sockets。有两种SocketChannel创建方法:

  1. 您打开一个SocketChannel并连接到Internet上某个服务器。
  2. 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的更详细,在本教程后面的文本解释。