2016-11-29 7 views
0

При попытке писать с помощью netty записанные данные никогда не заканчиваются на удаленной стороне, подтвержденные Wireshark.Netty не пишет

Я попытался:

//Directly using writeAndFlush 
channel.writeAndFlush(new Packet()); 

//Manually flushing 
channel.write(new Packet()); 
channel.flush(); 

// Even sending bytes won't work: 
channel.writeAndFlush(new byte[]{1,2,3}); 

исключение не поймать, когда я обернуть его в try{...}catch(Throwable e){e.printStackTrace();}

Что я могу сделать, чтобы отладить эту проблему?

ответ

4

Netty является асинхронным, что означает, что он не будет генерировать исключения при неудачной записи. Вместо того, чтобы бросать исключения, он возвращает Future<?>, который будет обновляться после завершения запроса. Убедитесь в том, чтобы войти исключений Исходя из этого, как ваши первые шаги отладки:

channel.writeAndFlush(...).addListener(new GenericFutureListener<Future<Object>>() { 
    @Override 
    public void operationComplete(Future<Object> future) { 
     // TODO: Use proper logger in production here 
     if (future.isSuccess()) { 
      System.out.println("Data written succesfully"); 
     } else { 
      System.out.println("Data failed to write:"); 
      future.cause().printStackTrace(); 
     } 
    } 
}); 

Или еще проще:

channel.writeAndFlush(...).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE); 

После получения первопричину, за исключением, там может быть несколько проблем:

java.lang.UnsupportedOperationException:
unsupported message type: <type> (expected: ...)

Примечание: Это также броски при использовании ObjectEncoder, но ваш объект не реализует Serializable

по умолчанию канал Нетти может только отправить ByteBuf с и FileRegion с. Вам нужно преобразовать свои объекты в эти типы либо путем добавления большего количества обработчиков к конвейеру, либо их преобразования вручную в ByteBuf.

A ByteBuf - это вариант Netty байтового массива, но он имеет потенциал для производительности, поскольку он может храниться в прямом пространстве памяти.

Следующие обработчики обычно используются:

Для того, чтобы преобразовать String использовать StringEncoder Для того, чтобы преобразовать Serializable использовать ObjectEncoder (предупреждение, не совместимы с обычными потоками объектов Java) Чтобы преобразовать byte[] использовать ByteArrayEncoder

Примечание: Поскольку TCP является протоколом потока на основе, вы usuall Я хочу, чтобы некоторые формы пакетов были прикреплены, так как вы не можете получать точные пакеты, которые вы пишете. См. Dealing with a Stream-based Transport в вики Netty для получения дополнительной информации.