鉴于我们接受消息的套接字连接(让我们称之为c1
),
我们有N个其他套接字连接我们要写完全相同的消息,
要确定我们希望它写入哪个连接,我们只需要从c1
读取前几个字节,但是套接字上剩余的字节不需要加载到java堆,只是要写入{ {1}} ...
简而言之,我们想要做的是。
我们得到了在c2
上读取字节的事件
我们读取前几个字节并确定我们知道要将其重定向到c1
。
我们将从c2
取得的前几个字节写入c1
,现在我们要告诉系统直接从c2
到c1
写下N个字节(而不是c1 - > java堆 - > c2)。
在java中有没有办法做到这一点?
虽然答案很明确,但如果你正在构建这样的东西(甚至不仅仅是多路复用而是一些小的业务逻辑),我强烈建议你选择ZeroMQ。
答案 0 :(得分:2)
假设我们正在做C ++有没有办法告诉操作系统将数据从缓冲区传递到缓冲区而不加载到应用程序内存中?
所以基本上问题是Linux允许将N个字节从套接字缓冲区A传递到套接字缓冲区B(我们可以放心地假设我们在linux上,并且没有其他人正在读取或写入A和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的答案,我认为答案可能是:"不可以'#34;。爱好。
更新3 - 这是RFE - https://bugs.openjdk.java.net/browse/JDK-6653061