使用Java在两个或多个套接字之间执行零拷贝数据传输

使用Java在两个或多个套接字之间执行零拷贝数据传输,java,file-io,zero-copy,Java,File Io,Zero Copy,有人知道有什么好的java库/API包在两个或多个套接字之间执行零拷贝数据传输吗?我知道Java的NIOAPI可以分别使用Java.NIO.channels.FileChannel.transferTo和Java.NIO.channels.FileChannel.transferFrom方法执行从磁盘到套接字的零拷贝数据传输,反之亦然。但是,似乎不支持java套接字到套接字的零拷贝传输。此外,任何可以执行系统调用拼接(可以将数据从文件描述符传输到管道,反之亦然)的java库/API都是一个优势,

有人知道有什么好的java库/API包在两个或多个套接字之间执行零拷贝数据传输吗?我知道Java的NIOAPI可以分别使用Java.NIO.channels.FileChannel.transferTo和Java.NIO.channels.FileChannel.transferFrom方法执行从磁盘到套接字的零拷贝数据传输,反之亦然。但是,似乎不支持java套接字到套接字的零拷贝传输。此外,任何可以执行系统调用拼接(可以将数据从文件描述符传输到管道,反之亦然)的java库/API都是一个优势,最好是在linux平台上

谢谢你的回复


此外,我已经阅读了以前大多数关于零拷贝的博客以及其他信息丰富的网站,如;但是,上面的问题似乎还没有得到解决。

我对SocketCannel了解不多,但我认为
ByteBuffer.allocateDirect()
是一个不错的选择

只需将套接字A的数据读入
ByteBuffer.allocateDirect()
,然后让套接字B从中读取,既简单又容易

区别如下:

1。老路

SocketA-->缓冲区A(内核空间)-->BufferB(用户空间)

BufferB(用户空间)-->BufferC(内核空间)-->SocketB

2。零拷贝方式

SocketA-->DirectBuffer(可从内核和用户空间访问)

DirectBuffer-->SocketB

注 嗯,我不认为我们可以直接做到,操作系统需要在发送数据之前将数据加载到物理内存中

==========编辑========= 根据您提到的文章,FileChannel的目标是这样做:


使用
ByteBuffer.allocateDirect()
您不需要在内核和用户空间之间切换上下文。读取和发送数据块时,唯一的缓冲区映射到物理内存。

这是两个副本,而不是零。IIRC,
zero Copy
意味着减少内核空间和用户空间之间的副本,对吗?但这不是内核空间内存和用户空间内存之间的副本,所以这是无关的。这是磁盘和内存之间的拷贝。请停止否认零拷贝I/O的存在,只需在谷歌上搜索一下,你就会发现see@RobinGreen根据需要,有从文件到缓冲区和从套接字缓冲区到套接字的复制。有没有一种方法可以在没有缓冲区的情况下直接从文件复制到套接字?如果是,你能分享一个链接吗?谢谢你们的回复!必须有一种方法可以使用java在套接字之间执行零拷贝数据传输。