2013-02-02 8 views
5

this blog postを見つけました。これは、Akka IOソケットサーバーに送信された文字列メッセージの固定長フレーミングを行う方法を示しています。私はhere called ScalaBuffというオープンソースライブラリを使って作業しており、プロトコルバッファオブジェクトの上に素敵な薄いレイヤーを作成しています。Akka IOとソケットによるプロトコルバッファメッセージ

私が抱えている問題は、長さ(4バイトシーケンス)とその後のprotobufバイト配列を取るブログ作成者(彼に直接連絡するためのリンクを見つけることができませんでした)を適合させることです。私は後でどのメッセージがワイヤ上にあるのか心配することができます。ただ今、ただ一つのサンプルメッセージでコードを動作させたいだけです。

私の問題は、Akka 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クラスが別に用意されているので、2つを混ぜないように注意してください。

更新:Kevinの問題は解決されました。基本的には、バイト配列を新しいString()にラップするのではなく、Array [Byte]のtoStringメソッドを使用していました。 "%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体験を自分で持っていません。 –

関連する問題