所以我有一个应用程序,我试图从外部应用程序接收一个对象(让它称之为Envelope
),通过{{在常规旧TCP套接字上进行序列化1}},在Akka中实现的服务器上。我设置的服务器角色与Akka TCP tutorial非常相似;下面是我的TCP消息处理程序的相关实现:
ObjectOuputStream
一切都在建立连接方面有效,但是一旦我尝试反序列化数据,我立即得到public class TcpEnvelopeHandler extends UntypedActor {
// implementaiton details
@Override
public void onReceive( Object message) throws Exception {
if (message instanceof Received) {
deserializeEnvelope( (Received) message);
} // More cases not relevent
}
public void deserializeEnvelope( Received message) throws Exception {
final ObjectInputStream dataStream = new ObjectInputStream( message.data().iterator().asInputStream() );
final Envelope envelope = (Envelope) dataStream.readUnshared();
// Do some stuff with envelope
}
}
(来自java.io.EOFException
)或readUnshared
(来自{{ 1}})。
基于检查原始java.io.StreamCorruptedException
数据以及对于从客户端发送的每个对象的事实,处理程序正在接收3条ObjectInputStream
条消息,非常清楚Akka只是向我发送原始数据包而不是正确地构建它们以进行反序列化。这是有道理的,因为它是Received
在标准Java客户端/服务器模型中的工作并且它阻塞,而Akka在阻塞方面并不重要。
我的问题是,当作为Tcp管理器的处理程序重新设置时,是否有任何标准的Akka功能/角色模仿Received
的功能?或者我真的必须手动实现自己合并的数据包吗?如果是这样,我将如何做到这一点?
感谢您的帮助!