java - 使用 Java 在两个或多个套接字之间执行零复制数据传输

标签 java file-io zero-copy

有没有人知道在两个或多个套接字之间执行零拷贝数据传输的任何好的 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的传输方式是这样的:

enter image description here

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

关于java - 使用 Java 在两个或多个套接字之间执行零复制数据传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20897315/

相关文章:

java - 计算文本文件中包含特定值的行数

c - 使用和不使用 Scatter/Gather 操作的零拷贝

c++ - Eigen 稀疏矩阵的零拷贝构造

java - Hbase 扫描正在返回已删除的行

java - Neo4j OGM @Properties 支持哪些条目类型?

android - 数据库在我的应用程序下载后似乎消失了。想法?

Linux 零拷贝

java - "GMT"是 Java TimeZone 中的缩写吗?如果是的话可以使用它吗?

java - 如果用户输入 QUIT,则退出 While 循环

c++ - 为什么 fread 提前到达 EOF?