假设我们有一个套接字连接(我们称其为c1
)我们接受消息的地方,
我们还有 N 个其他套接字连接,我们将写入完全相同的消息,
为了确定我们希望它写入哪个连接,我们只需要读取其中的前几个字节c1
,但是套接字上剩余的字节不需要加载到java堆中,只需写入c2
...
简而言之,我们想做的是。
我们收到了有字节要读取的事件c1
我们读取前几个字节并确定我们知道我们想要将其重定向到c2
。
我们获取已经获取的前几个字节c1
写到c2
现在我们要告诉系统写入接下来的 N 个字节c1
to c2
直接(而不是 c1 -> java 堆 -> c2)。
有什么方法可以在java中做到这一点吗?
Update:
尽管答案很切题,但如果您正在构建类似的东西(甚至不仅用于多路复用,还用于一些小的业务逻辑),我强烈建议您使用 ZeroMQ。
假设我们正在做 C++,有没有办法告诉操作系统将数据从一个缓冲区传递到另一个缓冲区而不加载到应用程序内存中?
所以基本上问题是Linux是否允许将N个字节从套接字缓冲区A传递到套接字缓冲区B(我们可以安全地假设我们在Linux上,并且没有其他人正在读取或写入A和B)
可以使用 Linux“sendfile”系统调用来完成此操作。
参考:
- http://man7.org/linux/man-pages/man2/sendfile.2.html http://man7.org/linux/man-pages/man2/sendfile.2.html
但是,Java I/O 类库不支持这一点。
UPDATE- 显然是支持的;看到FileChannel::transferTo
方法。查看答案FileChannel 零复制 TransferTo 无法将字节复制到 SocketChannel https://stackoverflow.com/questions/30018090/filechannel-zero-copy-transferto-fails-to-copy-bytes-to-socketchannel例如,它显示了与套接字一起使用的情况。但是,尚不清楚它是否可以用于套接字到套接字的复制。
UPDATE 2- 根据以下问题的答案使用 Java 在两个或多个套接字之间执行零复制数据传输 https://stackoverflow.com/questions/20897315/using-java-to-perform-zero-copy-data-transfers-between-two-or-more-sockets,我想答案可能是:“不,不能”。然而。
UPDATE 3- 这是 RFE -https://bugs.openjdk.java.net/browse/JDK-6653061 https://bugs.openjdk.java.net/browse/JDK-6653061
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)