zero allocation copy from socket to socket(从套接字到套接字的零分配复制)
问题描述
假设我们有一个套接字连接(让我们称之为c1
),
我们还有N个其他套接字连接,我们要写入完全相同的消息,
要确定我们希望它写入哪个连接,我们只需要从c1
读取前几个字节,但套接字上的其余字节不需要加载到Java堆中,只需写入c2
...
简而言之,我们想要做的是。
我们在c1
上有要读取的字节数的事件
我们读取前几个字节,并确定我们知道要将其重定向到c2
。
我们将已经从c1
获取的前几个字节写入c2
,现在我们想告诉系统直接从c1
写入c2
到c2
(而不是c1->Java heap->c2)。
Java中有什么方法可以做到这一点吗?
更新:
虽然答案是切中要害的,但如果您正在构建这样的东西(即使不仅是为了多路传输,还为了一些小的业务逻辑),我强烈建议您使用ZeroMQ。
推荐答案
假设我们正在执行C++操作,有没有办法告诉操作系统在不加载到应用程序内存的情况下将数据从一个缓冲区传递到另一个缓冲区?
所以基本上问题是Linux是否允许将N个字节从套接字缓冲区A传递到套接字缓冲区B(我们可以安全地假设我们在Linux上,并且没有其他人正在读取或写入A和B)
使用Linux发送文件和系统调用可以做到这一点。
引用:
- http://man7.org/linux/man-pages/man2/sendfile.2.html
但是,Java I/O类库不支持此功能。
更新-显然支持;请参阅FileChannel::transferTo
方法。请参见FileChannel zero-copy transferTo fails to copy bytes to SocketChannel的答案,以获取与套接字一起使用的示例。但是,尚不清楚它是否可用于套接字到套接字复制。
更新2-根据对Using Java to perform Zero Copy data transfers between two or more sockets的回答,我认为答案可能是:&不能。还没有。
更新3-这是RFE-https://bugs.openjdk.java.net/browse/JDK-6653061
这篇关于从套接字到套接字的零分配复制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:从套接字到套接字的零分配复制
基础教程推荐
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01