Wykonywanie kolejnych poleceń

0

Cześć,

Mam program, do którego podłączam urządzenia.
Aby urządzenia mogły rozpocząć współpracę muszą wymienić między sobą kilkadziesiąt wiadomości (można powiedzieć, że się konfigurują).
Wygląda to mniej więcej tak:
1.Sewer nasłuchuje
2.Urządzenie się podłącza.
3.Serwer wysyła wiadomość
4.Urządzenie wysyła odpowiedź.

Punkty 3 i 4 powtarzają się, aż sekwencja się zakończy (około 50 razy).

Serwer wysyła wiadomości są różnego rodzaju i niektóre z nich są zależne od tego co urządzenie odpowie.
Może zdarzyć się tak, że w zależności od tego co urządzenie odpowie to serwer pominie kilka wiadomości (które normalnie mógłby wysłać).
Obecne moje rozwiązanie (o którym na razie nie chce mówić, żeby nic nie sugerować) jest troche słabe.
Poszukuje jakiegoś dobrego szymelu, za pomocą którego ładnie ogarnę wymianę tych wiadomości.
Będę wdzięczny za pomysły/propozycje.

0

Pytanie - jak wygląda ta "wymiana".

  1. Jeśli to jest na zasadzie: klient wysyła wiadomość -> serwer odpowiada -> zapętlić to spokojnie można użyć któregoś z protokołów HTTP: REST lub SOAP + token uwierzytelniający.
  2. Jeśli to jest na zasadzie: klient wysyła wiadomość -> serwer odpowiada -> serwer decyduje wysłać inną wiadomość -> klient odpowiada - to chyba najlepiej zorganizować sobie swój protokół, ewentualnie z serializacją do JSON/XML (bo do tego są biblioteki), ale najlepiej to otworzyć Socket i niech gadają.
  3. Jest jeszcze opcja kombinowana - urządzenie rejestruje się pod adresem i wysyła klucz, po którym identyfikuje serwer, a dalej już po HTTP.
1

Abstrachując od protokołu komunikacji, jak dla mnie to klasyczny przykład dla maszyny stanów. W zależności od odpowiedzi klienta serwer przechodzi w odpowiedni stan, dla którego ma zdefiniowaną następną wiadomość do wysłania. Problematyczne w Twoim przypadku może być jedynie skonfigurowanie takiej maszyny, jeżeli masz około 50 wiadomości w czasie konfiguracji to pewnie stanów wyjdzie trochę więcej więc diagram przejść będzie skomplikowany (są jakieś biblioteki do tego ale nie miałem przyjemności z żadną), ewentulanie możnaby się posiłkować jakimś silnikiem reguł biznesowych.

0

Problem nie jest z protokołem, ani z wymianą wiadomości, a bardziej z tym jak ładnie zapisać tą cały wymianę wiadomości.
Często zdarza się, że urządzenie odpowie tym samym komunikatem na różne requesty (np. "przyjąłęm wiadomość").
Próbuje to ładnie zakodzić:
Serwer wysyła wiadomość aaa, urządzenie odpowiada na to xxx
Teraz muszę jakoś ogarnąć, że serwer jest już po pierwszej wysyłce wiadomości i urządzenie ją przyjęło, więc serwer wysyła wiadomość bbb, urządzenie odpowiada.
Teraz serwer musi wiedzieć, że wysłał już aaa i bbb i powinien wysłać ccc.
Itd...

Robi mi się z tego ogromna ifologia, a tego wolałbym uniknąć.

0

Idea workflow przychodzi mi do głowy, tj.

Serwer tworzy specjaln6 handler dla każdego klienta.
W tym handlarze trzyma dwie rzeczy: fazę w ktorej jest i jakiś RequestHandler.

No i lecisz:

  1. Rejestracja klienta, serwer tworzy handler i ustawia go na fazę 1.
  2. Ustawienie fazy 1 powoduje ustawienie RequestHandler rh = new Phase1RequestHandler()
  3. Przychodzi kolejny request - Phase1RequestHandler go obsluguje, w razie czego zmienia stan ClientHandlera.
    Itp. Itd.

Wcześniej dobrze sobie rozrysować wszystko na jakimś diagramie i zastanowić się ile tych handlerów musi być. Do tego są też pewnie gotowe biblioteki, zazwyczaj takie rzeczy robiłem na jakichś kobyłach klasy Enterprise, ale jak poszukasz to może znajdziesz coś mniejszego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1