2013-02-02 156 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經驗。 –