2015-02-19 1 views
1

в моем клиентском> серверном приложении, клиент отправит код операции, который сообщает серверу, какой сервис инициировать, однако дизайн немного странный, когда он приходит, чтобы обновлять запросы, когда я получаю код операции, клиент ожидает 8 (фиктивных) байтов, чтобы сообщить ему начать отправлять данные обновления.Декодер «handshake» Netty, лучший способ сообщить клиенту отправить данные

Вот мое рукопожатие декодер:

@Override 
protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out) { 
    if (!buffer.isReadable()) { 
     return; 
    } 

    int id = buffer.readUnsignedByte(); 

    switch (id) { 
    case HandshakeConstants.SERVICE_GAME: 
     ctx.pipeline().addFirst("loginEncoder", new LoginEncoder()); 
     ctx.pipeline().addAfter("handshakeDecoder", "loginDecoder", new LoginDecoder()); 
     break; 
    case HandshakeConstants.SERVICE_UPDATE: 
     ctx.pipeline().addFirst("updateEncoder", new UpdateEncoder()); 
     ctx.pipeline().addBefore("handler", "updateDecoder", new UpdateDecoder()); 

     // XXX: Better way? 
     ByteBuf buf = ctx.alloc().buffer(8).writeLong(0); 
     ctx.channel().writeAndFlush(buf); 
     break; 
    default: 
     throw new IllegalStateException("Invalid service id"); 
    } 

    ctx.pipeline().remove(this); 
    out.add(new HandshakeMessage(id)); 
} 

Как вы можете видеть в коде после того, как я добавить соответствующий кодер и канальный обработчик для обслуживания к трубопроводу, я должен написать 8 байт, чтобы сообщить клиенту начать отправку данных обновления; есть ли (чистый) способ обойти это?

ответ

3

Я думаю, что ваше решение имеет смысл, и я не вижу в этом ничего плохого.

+0

Я рад, что это имеет смысл для кого-то: P это просто неправильно для меня, я не знаю почему. Спасибо за заверение. – rmcmk

Смежные вопросы