gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:52:57 30 4
gpt4 key购买 nike

假设我们有一个套接字连接(我们称之为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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com