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 для получения дополнительной информации.