使用Java在两个或多个套接字之间执行零拷贝数据传输
有没有人知道在两个或多个套接字之间执行零拷贝数据传输的任何好的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 – > SocketB
注意
恕我直言,我不认为我们可以直接使它成为SocketA -> SocketB
,os需要在发送之前将数据加载到物理内存中。
=========编辑=========
根据您提到的文章,FileChannel的transferTo这样做:
使用ByteBuffer.allocateDirect()
您不需要在内核和用户空间之间切换上下文。 唯一的缓冲区映射到物理内存,而读取和发送使用相同的块。