2013-02-02 12 views
5

Natknąłem się na this blog post, które okazało się niesamowite i pouczające, pokazując, jak tworzyć ramkę o stałej długości z wiadomości tekstowych wysyłanych do serwera gniazd Akka IO. Pracowałem z biblioteką open source, którą znalazłem here called ScalaBuff, która tworzy ładną cienką warstwę na wierzchu obiektów bufora protokołu.Komunikaty o buforach protokołów za pośrednictwem Akka IO i gniazd

Problem polega na tym, że dostosowuję autora bloga (nie mogę znaleźć odnośnika do bezpośredniego kontaktu z nim), aby pobrać długość (4-bajtową sekwencję), a następnie tablicę bajtów protobuf. Mogę się martwić o ustalenie, która wiadomość jest na drucie później, teraz chcę tylko, żeby kod zadziałał z jedną przykładową wiadomością.

Mój problem polega na tym, że mam problem z przekonwertowaniem kodu Akka IO z ciągnięcia akka ByteStrings na możliwość wysyłania i pobierania surowych bajtów z komunikatu protobuf. Jest to symptom mojego braku znajomości serwerów gniazd przy użyciu Akka IO. Mogę dostać się do bajtowej reprezentacji mojego obiektu protobuf (Zombie Sighting), ale nie mogę pobrać próbki z bloga do pracy na tablicach bajtów zamiast ciągów.

Jeśli ktoś ma jakąś radę, przykładowy kod lub jakieś informacje, jak dostać się z punktu A (wyżej wymieniony blog) do punktu B (klient gniazda Akka IO, który wysyła komunikat protobuf do gniazda Akka IO serwer .. Myślę, że mam klienta działającego ... może), byłoby niesamowite.

+0

Okazało się, że mój problem nie miał nic wspólnego z Akka IO ani nawet Scala. Kiedy wysyłałem, wysyłałem to, co równało się "toString" reprezentacji tablicy bajtów protobuf, zamiast rzeczywistej tablicy bajtów przekonwertowanej poprawnie na łańcuch. –

Odpowiedz

0

Spróbuj tego:

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

MyMessage jest ScalaBuff-klasa kompilator generowane przy użyciu szablonu MyMessage.proto. Zauważ, że biblioteka Google protobuf ma oddzielną klasę ByteString, upewnij się, że jej nie miksujesz.

AKTUALIZACJA: Problem Kevina został rozwiązany, w zasadzie problem polegał na tym, że używał on metody toString tablicy [Bajt] zamiast owijać tablicę bajtów w nowy ciąg(), który poprawnie konwertuje tablicę bajtów na Łańcuch, który ma być użyty w wywołaniu "% s" .format.

+0

Widziałem i użyłem funkcji toArray i mergeFrom przed. Mój problem polega na tym, że nie wiem, jak rozebrać bajtowe elementy kadru z próbki kodu na tym blogu. Nie mogę się dowiedzieć, jak stwierdzić, kiedy jedna wiadomość przestaje, a druga zaczyna się, gdy czytam tylko ze strumienia gniazd ... Czy miałeś szansę pokazać mi, jak wygląda czytanie i pisanie tych tablic na gniazdach Akka IO? –

+0

Czy próbowałeś użyć metod 'mergeDelimitedFrom (InputStream)' i 'writeDelimitedTo (OutputStream)'? Metoda 'writeDelimitedTo' w zasadzie dodaje separator między wiadomościami, więc metoda' mergeDelimitedFrom' wie, kiedy poprawnie je odczytać. –

+0

Może pomoże Ci [tutorial Akka IO] (http://doc.akka.io/docs/akka/2.0/scala/io.html)? Spróbuj też wejść na #scala lub #akka na kanale IRC Freenode. Niestety, nie mam zbyt wiele doświadczenia z Akka 2.0 IO. –

Powiązane problemy