有没有人知道在两个或多个套接字之间执行零拷贝数据传输的任何好的 java 库/API 包?我知道 Java 的 NIO API 可以分别使用 java.nio.channels.FileChannel.transferTo 和 java.nio.channels.FileChannel.transferFrom 方法执行从磁盘到套接字的零拷贝数据传输,反之亦然。但是,似乎不支持 java 套接字到套接字零复制传输。此外,任何可以执行系统调用拼接(可以将数据从文件描述符传输到管道,反之亦然)的 Java 库/API 都将是一个优势,最好是在 linux 平台上。
感谢您的回复。
此外,我已经阅读了之前大部分关于零复制的博客以及其他信息网站,例如http://www.ibm.com/developerworks/library/j-zerocopy/。 ;但是,上述问题似乎并未得到解决。
最佳答案
我对 SocketChannel 了解不多,但我认为 ByteBuffer.allocateDirect()
是您不错的选择。
只需将套接字 A 的数据读入 ByteBuffer.allocateDirect()
并让套接字 B 从中读取数据,简单易行。
区别如下:
<强>1。老办法
SocketA --> BufferA(内核空间) --> BufferB(用户空间)
BufferB(用户空间) --> BufferC(内核空间) --> SocketB
<强>2。零拷贝方式
SocketA --> DirectBuffer(可以从内核和用户空间访问)
DirectBuffer --> 套接字B
注意事项
恕我直言,我认为我们不能直接SocketA -> SocketB
,操作系统需要在发送数据之前将数据加载到物理内存中。
========= 编辑 =========
根据你提到的文章,FileChannel的传输方式是这样的:
使用 ByteBuffer.allocateDirect()
您不需要在内核空间和用户空间之间切换上下文。唯一的缓冲区映射到物理内存,同时读取和发送使用相同的 block 。
关于java - 使用 Java 在两个或多个套接字之间执行零复制数据传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20897315/