从套接字到套接字的零分配复制

zero allocation copy from socket to socket

鉴于我们有一个接受消息的套接字连接(我们称之为 c1), 并且我们有 N 个其他套接字连接,我们将要写入完全相同的消息, 要确定我们希望它写入哪个连接,我们只需要从 c1 中读取前几个字节,但套接字上的其余字节不需要加载到 java 堆中,只是为了写入 c2...

简而言之,我们要做的是。 我们得到了我们有字节要读取的事件 c1 我们读取前几个字节并确定我们知道我们想要将其重定向到 c2。 我们将已经从 c1 中获取的前几个字节写入 c2,现在我们想告诉系统直接将接下来的 N 个字节从 c1 写入 c2(而不是 c1 -> java 堆 -> c2).

在java中有什么方法可以做到这一点吗?


更新:

虽然答案很重要,但如果您正在构建这样的东西(甚至不仅用于多路复用,还用于一些小的业务逻辑),我强烈建议您使用 ZeroMQ。

Say we are doing C++ is there a way to tell the OS to pass data from buffer to buffer without loading into application memory?

So basically the question is does Linux allow to pass N bytes from socket buffer A to socket buffer B (we can safely assume that we are on linux, and that no one else is reading or writing to A and B)

可以使用 Linux“sendfile”系统调用来做到这一点。

参考:

但是,Java I/O class 库不支持此功能。

UPDATE - 显然是支持的;请参阅 FileChannel::transferTo 方法。请参阅 的答案以获取显示此与套接字一起使用的示例。不过不清楚是否可以用于套接字到套接字的拷贝。

更新 2 - 根据 Using Java to perform Zero Copy data transfers between two or more sockets 的答案,我认为答案可能是:“不,它不能”。然而

更新 3 - 这是 RFE - https://bugs.openjdk.java.net/browse/JDK-6653061