Есть ли подобная функция Java ByteBuffer для функции указателя в C - PullRequest
1 голос
/ 01 июня 2011

Я использую ByteBuffer для передачи данных с помощью Java Java.Одно и то же сообщение может быть отправлено нескольким получателям.Формат сообщения - «заголовок сообщения + содержание сообщения».Звездный путь - выделить новый байтовый буфер для каждого получателя.Это не эффективно.

Мой вопрос заключается в том, существует ли подобная Java-функция для ByteBuffer для функции указателя в C / C ++.Таким образом, я могу использовать один буфер для хранения содержимого сообщения и объединения с различными заголовками.Таким образом, это эффективность.

спасибо.

Ответы [ 2 ]

2 голосов
/ 01 июня 2011

В Java вы можете использовать GatheringByteChannel (с которым вы, скорее всего, имеете дело).Это позволяет иметь один статический буфер, содержащий заголовок, и отдельный буфер для каждого клиента, содержащего различное содержимое.Чтобы начать работу с некоторыми материалами, вы можете проверить это сообщение в блоге:

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

0 голосов
/ 01 июня 2011

Я использую один 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 для каждого соединения. Существует только одна копия содержимого.

Пример того, как может выглядеть 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);
}
...