2

ByteBuffer を使用して Java nio でデータを転送しています。同じメッセージを複数の受信者に送信できます。メッセージのフォーマットは「メッセージヘッダー+メッセージ内容」です。簡単な方法は、各レシーバーに新しいバイト バッファーを割り当てることです。これは効率的ではありません。

私の質問は、C/C++ で ByteBuffer からポインター関数への同様の Java 関数があるかどうかです。したがって、1 つのバッファーを使用してメッセージの内容を保持し、さまざまなヘッダーと連結できます。このように効率化です。

ありがとう。

4

2 に答える 2

2

Java では、a を使用できますGatheringByteChannel(これはおそらく扱っているものです)。これにより、ヘッダーを含む 1 つの静的バッファーと、さまざまなコンテンツを保持するクライアントごとに個別のバッファーを持つことができます。開始するためのいくつかの資料については、次のブログ投稿を確認してください。

http://javaol.wordpress.com/2011/05/06/java-nio-scatter-gather/

于 2011-06-01T14:29:24.850 に答える
0

単一の ByteBuffer を使用して、複数の受信者に送信します。

ByteBuffer bb = ByteBuffer.allocateDirect(LARGE_BUFFER);
bb.clear();
bb.position(START_OF_CONTENT /* 1024 */);
appendContentTo(bb);
int endOfContent = bb.position();

bb.limit(endOfContent);
for(Connection conn: connections) {
    bb.position(START_OF_CONTENT);
    /* prepend header BEFORE the position and move the position back */
    conn.prependHeader(bb); 
    conn.write(bb);
}

このようにして、すべての接続に同じ ByteBuffer を使用できます。コンテンツのコピーは 1 つだけです。

conn.prependHeader() がどのように見えるかの例

public void prependHeader(ByteBuffer bb) {
    // bb starts at the start of the content.
    int pos = bb.position();
    // it would be better if a byte[] wasn't required. This is just an example
    byte[] header = getHeaderAsBytes();
    bb.position(bb.position()-header.length);
    bb.put(header);
    // bb starts at the start of the header.
    bb.position(bb.position()-header.length);
}
于 2011-06-01T14:52:56.517 に答える