2014-04-07 13 views
7

Napisałem klienta i serwer za pomocą pliku akka.io.tcp i mam problem z odczytaniem wiadomości wysłanych przez klienta. Użyłem json do wysyłania wiadomości. Na stronie klienta, to wpisz wiadomość w ten sposób:Akka IO.TCP z Jsonem

connection ! Write(ByteString(msgString)) 

po stronie serwera Mam następujący:

override def receive: Receive = { 
    case Received(data) => listener ! Json.parse(data.utf8String) 
    case PeerClosed => { 
    context stop self 
    } 
} 

problem jest Akka czyta więcej niż jedną wiadomość na raz, więc dostaję nieważnego Jsona. Czy istnieje sposób, aby akka czytał tylko jedną wiadomość na raz?

+4

Może się mylę, ale wierzę, że ta część będzie na tobie. Będziesz musiał napisać logikę, która wie, kiedy jeden wniosek się kończy, a drugi zaczyna i obsługuje zatrzymywanie niekompletnych żądań i łączenie ich z resztą, gdy przychodzi. Wierzę w terminologię Netty, to byłby FrameDelimiter w przygotowaniu , ale nie sądzę, aby istniała analogiczna funkcja w tej chwili w Akka Tcp (chociaż mogę się mylić). – cmbaxter

Odpowiedz

6

Moduł TCP firmy Akka jest (i ma być) bardzo "niski poziom", więc nie dostarczamy żadnych ograniczników ramek. Powinieneś traktować go bardziej jak blok konstrukcyjny poziomu TCP, a następnie musisz budować swoje rzeczy.

W twoim przykładzie Aktor musiałby zebrać nadchodzące porcje danych i wykryć, kiedy dokument json jest "ukończony", a następnie wywołać polecenie "nonaszkowanie".

Pomysł dostarczenia czegoś z pudełka jest bardzo atrakcyjny ... Zapytam chłopaków, jakie są nasze plany dotyczące wspierania tego rodzaju przypadków użycia.

Nadal mam nadzieję, że to pomogło!

+1

ok. teraz mam kolejną wątpliwość: otrzymuję więcej niż jedną wiadomość na raz. czy można na przykład otrzymać połowę wiadomości? – Augusto

+1

Tak, jak wspomniano wcześniej, kod Akka Tcp nie ma pojęcia o ogranicznikach ramek, a zatem wysyła wszystko, co ma, niezależnie od tego, czy dla ciebie jest to pełen fragment danych, czy nie. Musisz to wszystko złożyć samodzielnie. – cmbaxter

+0

To, co możesz zrobić, aby to rozwiązać, to zebrać wszystkie porcje, a następnie na każdym otrzymaniu spróbuj sprawdzić, gdzie kończy się dokument JSON (jeśli się kończy), a następnie wyodrębnij tę część ze swojego "zagregowanego ciągu", a następnie "Json". .paruj to. Lub możesz wprowadzić innego aktora, który zrobiłby dzielenie, i wysłać _full_ json ciągi do "aktora parsera" ... Kilka pomysłów :-) –