本文介紹了從套接字到套接字的零分配復制的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
假設我們有一個套接字連接(讓我們稱之為c1
),
我們還有N個其他套接字連接,我們要寫入完全相同的消息,
要確定我們希望它寫入哪個連接,我們只需要從c1
讀取前幾個字節,但套接字上的其余字節不需要加載到Java堆中,只需寫入c2
…
簡而言之,我們想要做的是。
我們在c1
上有要讀取的字節數的事件
我們讀取前幾個字節,并確定我們知道要將其重定向到c2
。
我們將已經從c1
獲取的前幾個字節寫入c2
,現在我們想告訴系統直接從c1
寫入c2
到c2
(而不是c1->Java heap->c2)。
Java中有什么方法可以做到這一點嗎?
更新:
雖然答案是切中要害的,但如果您正在構建這樣的東西(即使不僅是為了多路傳輸,還為了一些小的業務邏輯),我強烈建議您使用ZeroMQ。
推薦答案
假設我們正在執行C++操作,有沒有辦法告訴操作系統在不加載到應用程序內存的情況下將數據從一個緩沖區傳遞到另一個緩沖區?
所以基本上問題是Linux是否允許將N個字節從套接字緩沖區A傳遞到套接字緩沖區B(我們可以安全地假設我們在Linux上,并且沒有其他人正在讀取或寫入A和B)
使用Linux發送文件和系統調用可以做到這一點。
引用:
http://man7.org/linux/man-pages/man2/sendfile.2.html
但是,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
這篇關于從套接字到套接字的零分配復制的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,