假设我们有一个套接字连接(我们称之为c1
),我们可以在其中接受消息,
我们还有 N 个其他套接字连接,我们将写入完全相同的消息,
为了确定我们希望它写入哪个连接,我们只需要从c1
读取前几个字节,但是套接字上的其余字节不需要加载到java堆中,只需要将写入c2
...
简而言之,我们想做的是。
我们收到了在 c1
上有字节要读取的事件
我们读取前几个字节并确定我们想要将其重定向到c2
。
我们将从 c1
中获取的前几个字节写入 c2
,现在我们要告诉系统从 c1
写入接下来的 N 个字节> 直接到 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 类库不支持这一点。
更新 - 显然是支持的;请参阅 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
关于java - 从套接字到套接字的零分配复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45725564/