首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java在两个或多个套接字之间执行零复制数据传输

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

Stack Overflow用户
提问于 2014-01-03 05:43:05
回答 1查看 3K关注 0票数 11

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

谢谢你的回应。

此外,我已经阅读了大部分以前的博客,关于零拷贝以及其他信息网站,如http://www.ibm.com/developerworks/library/j-zerocopy/;然而,上面的问题似乎没有得到解决。

EN

回答 1

Stack Overflow用户

发布于 2014-01-03 05:54:49

我对SocketChannel不太了解,但我认为ByteBuffer.allocateDirect()是一个很好的选择。

只需将套接字A的数据读入ByteBuffer.allocateDirect(),让socket B从它读取,简单易用。

以下是不同之处:

1.旧方式

SocketA ->BufferA(内核空间)->BufferB(用户空间)

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

2.零拷贝方式

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

DirectBuffer -> SocketB

备注

IMHO,我不认为我们可以让它直接SocketA -> SocketB,操作系统需要将数据加载到物理内存,然后才能发送出去。

=========编辑=========

根据您提到的文章,FileChannel的transferTo是这样做的:

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20897315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档