В модели сервера-клиента на основе TCP, использующей Netty Channels, существует ли какое-либо соответствие между количеством Channel.write()
с сервера и соответствующим Channel.messageReceived()
на принимающем клиенте? Если я делаю 10 writes()
на отправителя, значит ли это, что messageReceived()
будет вызываться 10 раз на слушающем клиенте? или Netty может агрегировать отправленные данные (от write()
s от отправителя) до более или менее числа messageReceived()
событий на клиенте? Есть ли способ настроить это поведение в Netty?Сообщение Channel.messageReceived в Netty
ответ
Не гарантируется, что у вас есть сопоставление 1: 1 для ваших вызовов Channel.write (..) и messageReceived. Вам нужно использовать некоторый подкадр FrameDecoder (возможно, написать свой собственный), который будет буферизовать ChannelBuffer, пока вы не получите достаточно данных, чтобы отправить ваше сообщение следующим ChannelHandlers в ChannelPipeline на сервере.
Netty уже поставляется с некоторыми готовыми к использованию реализациями FrameDecoder, такими как, например, DelimiterBasedFrameDecoder, который будет буферизовать данные до тех пор, пока не получит разделитель, а затем отправит их следующим обработчикам в ChannelPipeline.
См. [1] для получения более подробной информации.
[1] http://netty.io/docs/stable/api/org/jboss/netty/handler/codec/frame/FrameDecoder.html
Да, есть способ сделать это, но вам нужно будет дать нам больше, чтобы сделать что-нибудь еще.