На стороне клиента у меня есть исправный сокет, отправляющий объект Java:
Detail detail = new Detail(); //client object
Socket client = new Socket(host, port);
OutputStream out = client.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(detail);
oos.flush();
Примечание: это клиентский сокет, поэтому его нельзя изменить.
На стороне сервера у меня есть camel-2.14.1 + Spring + netty4, работающий в Jboss AS7, который имеет этот простой пользовательский рут:
from("netty4:tcp://0.0.0.0:6549?"+
"keepAlive=true&sync=true&decoder=#detailDecoder&encoder=#detailEncoder")
.log("server recive: ${body.getArea}")
.processRef("someDetailProcessor") //loaded with Spring
.log("response [${body.getArea}]");
Я уже понял, что не могу использовать StringDecoder/StringEncoder
для десериализации / сериализации объектов, потому что эти кодировщики ждут более текстовых сообщений.
По этой причине я использовал ObjectDecoder/ObjectEncoder
, вводя их вот так:
<bean id="objDecoder" class="org.apache.camel.component.netty4.ChannelHandlerFactories" factory-method="newObjectDecoder">
<constructor-arg name="protocol" value="tcp"/>
</bean>
<bean id="objEncoder" class="org.apache.camel.component.netty4.ChannelHandlerFactories" factory-method="newObjectEncoder">
<constructor-arg name="protocol" value="tcp"/>
</bean>
Но мой объект превышает максимальную длину кадра, вызывая исключение -
Closing channel as an exception was thrown from Netty. Caused by: [io.netty.handler.codec.TooLongFrameException - Adjusted frame length exceeds 1048576: 2901213193 - discarded]
Я попытался настроить LengthFieldBasedFrameDecoder
(который является суперклассом ObjectDecoder
и также ожидает целочисленное поле заголовка, которое представляет длину тела сообщения, поэтому бесполезно). Я также использовал ByteToMessageDocoder
по-разному (создав свой собственный класс и пытаясь декодировать ByteBuf
в деталь), но без особого успеха.
Кто-нибудь знает, как этого добиться? Мне просто нужно получить простой предмет, не должно быть так сложно, не так ли?
ObjectOutputStream
. Пожалуйста, используйтеObjectEncoder
илиObjectEncoderOutputStream
, чтобы обеспечить совместимость с этим декодером ...... Я использую ObjectOutputStream для отправки объекта :( аааааааааааааааааааааааааааааааааааа более там я почти готов !! - person robert   schedule 20.02.2015