2013-02-02 2 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 클래스가 있으므로 두 클래스를 섞어서 사용하지 않아야합니다.

업데이트 : Kevin의 문제가 해결되었습니다. 기본적으로 문제는 바이트 배열을 새 String()으로 올바르게 바꾸는 대신 바이트 배열을 래핑하는 대신 Array [Byte]의 toString 메서드를 사용하는 것이 었습니다. "% s".format 호출에 사용될 문자열입니다.

+0

전에 toArray 및 mergeFrom 코드를보고 사용했습니다. 내 문제는 그 블로그의 코드 샘플에서 바이트 프레이밍을 제거하는 방법을 모른다는 것입니다. 소켓 메시지를 읽는 중 하나의 메시지가 멈추고 다른 메시지가 시작되는 경우를 알 수있는 방법을 알아낼 수 없습니다 ... Akka IO 소켓을 통해 이러한 배열을 읽거나 쓰는 것처럼 보이는지 알려주시겠습니까? –

+0

'mergeDelimitedFrom (InputStream)'및'writeDelimitedTo (OutputStream)'메소드를 사용해 보셨습니까? 'writeDelimitedTo' 메쏘드는 기본적으로 메시지들 사이에 분리 문자를 추가하므로'mergeDelimitedFrom' 메쏘드는 그것들을 올바르게 읽는 방법을 알고 있습니다. –

+0

[Akka 입문서] (http://doc.akka.io/docs/akka/2.0/scala/io.html)가 도움이 될 수 있습니까? Freenode IRC 채널에서 #scala 또는 #akka로 이동해보십시오. 슬프게도, 나는 Akka 2.0 IO 경험이 많지 않습니다. –

관련 문제