Apache Mina - несколько маленьких писем для клиента - PullRequest
1 голос
/ 20 марта 2012

Я создал tcp-сервер на основе apache mina 2.0.4, и у меня возникли некоторые проблемы с обратной записью на клиент.

У нас есть несколько tcp-клиентов, которые могут обрабатывать только одно сообщение за раз и с размером буфера не более 256 байт. Когда я отправляю 2+ сообщения (<256 байт) клиенту, они приходят в один или два больших блока, которые клиент не может обработать, вместо 2+ отдельных сообщений. Я попытался установить <code>sessionConfig.setTcpNoDelay(true/false); безуспешно, а также sessionConfig.setSendBufferSize( 256 );.

В кодировщике ответа на сообщение я также попытался сбросить вывод:

int capacity = 256;
IoBuffer buffer = IoBuffer.allocate(capacity, false);
buffer.setAutoExpand(false);
buffer.setAutoShrink(true);
buffer.putShort(type);
buffer.putShort(length);
buffer.put(gmtpMsg.getMessage().getBytes());
buffer.flip();
out.write(buffer);
out.flush();

И в ветке, ответственной за отправку сообщений, я пытался дождаться написания сообщения

for (Entry<Long, OutgoingMessage> outgoingMsg : outgoingMsgs.entrySet()) {
      WriteFuture future = session.write(outgoingMsg.getValue());
      future.awaitUninterruptibly();
}

Все это с треском проваливается, и единственное работающее решение - это нелепый 500-миллисекундный сон между записью сеанса, что вряд ли приемлемо. Кто-нибудь видит, что я делаю не так?

1 Ответ

1 голос
/ 21 марта 2012

После прочтения немного больше о протоколе tcp и особенно https://stackoverflow.com/a/6614586/1280034, становится ясно, что проблема на стороне клиента, не в правильной обработке пакетов.

Поскольку мы не можем перестроитьклиенты, мое единственное решение - задерживать каждое исходящее сообщение примерно на 500 мс.Для этого я создал дополнительную очередь, отвечающую за запись для клиентов, чтобы сервер продолжал свою обычную работу.

...