2013-02-02 110 views
5

我遇到了this blog post,我发现它很棒并且很有启发性,展示了如何对发送到Akka IO套接字服务器的字符串消息进行固定长度的帧定位。我一直在使用一个开放源代码库,我发现here called ScalaBuff,它在协议缓冲区对象上创建了一个漂亮的薄层。通过Akka IO和套接字协议缓冲区消息

我遇到的麻烦是在修改博客作者(找不到直接与他联系的链接)代码以获取长度(4字节序列),然后是protobuf字节数组。我可以担心后来确定哪些消息在网络上,现在我只想让代码使用一条示例消息。

我的问题是,我无法将阿卡IO代码从拉akka ByteStrings转换为能够发送和从protobuf消息拉原始字节。这是我不熟悉使用Akka IO的套接字服务器的症状。我可以与我的protobuf对象的字节表示(一个Zombie Sighting),但我不能从博客的示例工作字节数组而不是字符串。

如果任何人有一些建议,一些示例代码或关于如何从A点(上面提到的博客文章)到B点的输入(一个Akka IO套接字客户端,它将一个protobuf消息发送到Akka IO套接字服务器..我想我有客户端工作..也许),这将是非常棒的。

+0

发现我的问题与Akka IO甚至Scala无关。当我发送时,我发送的是等同于protobuf字节数组的“toString”表示,而不是将实际字节数组正确转换为字符串。 –

回答

0

试试这个:

val myByteArray = myByteString.toArray // converts to an Array[Byte] 
val myMessage = MyMessage.defaultInstance.mergeFrom(myByteArray) 

MyMessage是使用MyMessage.proto模板ScalaBuff编译器生成的类。请注意,Google protobuf库有一个单独的ByteString类,请确保不要混合这两个类。

更新:凯文的问题已经解决,基本上问题是他正在使用数组[字节]的toString方法,而不是将字节数组包装在新的String()中,该数组正确地将字节数组转换为字符串,用于“%s”.format调用。

+0

我已经看过并使用过toArray和mergeFrom代码。我的问题是我不知道如何从该博客中的代码示例中去除字节框架内容。我无法弄清楚如何判断一条消息何时停止,另一条是如何从一个套接字流中读取数据......有什么机会可以告诉我看起来像在Akka IO套接字上读写这些数组的方式? –

+0

您是否尝试过使用'mergeDelimitedFrom(InputStream)'和'writeDelimitedTo(OutputStream)'方法? 'writeDelimitedTo'方法基本上在消息之间添加了一个分隔符,所以'mergeDelimitedFrom'方法知道如何正确读取它们。 –

+0

也许[Akka IO教程](http://doc.akka.io/docs/akka/2.0/scala/io.html)可以帮到你吗?也可以尝试去Freenode IRC频道的#scala或#akka。可悲的是,我自己没有太多的Akka 2.0 IO经验。 –