Программная очистка канала в Netty - PullRequest
0 голосов
/ 06 декабря 2011

У меня есть приложение Netty, которое принимает HTTP-соединения и передает потоковые данные обратно, сохраняя соединение открытым до тех пор, пока клиент не закроет его.Я могу заставить приложение работать, за исключением того, что буфер отправки не отправляет клиенту достаточно часто (и часто через объединенные события записи, что вызывает неполное получение данных на другом конце, пока не будет выдвинут следующий буфер, что может занять много времени).приход).Я хотел бы знать, есть ли для меня способ записи в буфер отправки и принудительной очистки, чтобы передать клиенту полный кусок данных без необходимости закрывать сокет.

Я посмотрел наСвойства начальной загрузки tcpNoDelay, writeBufferHighWaterMark и writeBufferLowWaterMark (все с и без "child.") безрезультатно.

Есть предложения?Спасибо!

Ответы [ 3 ]

2 голосов
/ 07 декабря 2011

На всякий случай неясно, у Netty нет операции flush().Он просто пишет как можно скорее.

1 голос
/ 24 апреля 2012

Я думаю, что вы можете добавить BufferedWriteHandler к ChannelPipeline, чтобы эмулировать буферизованную операцию записи.

BufferedWriteHandler web doc

Пока вы можете поддерживать или получить ссылку на конвейерный экземпляр BufferedWriteHandler,

public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
        BufferedWriteHandler bufferedWriter 
                = e.getChannel().getPipeline().get("buffer");

тогда вы можете программно сбросить, как вам нравится:

bufferedWriter.flush();
0 голосов
/ 07 декабря 2011

Я думаю, что ответил на свой вопрос, и это не было связано с тем, что буфер сокета не отправлял данные. Я использовал «curl» для проверки ответа, и у curl есть внутренний буфер, который предотвращал вывод данных на экран. Это можно отключить с помощью «-N». Полностью моя вина, но все же потребовалось время, чтобы покопаться в коде и отследить его до моего клиента.

...