Serwer dla komunikatora

0

Witam,
Zastanawiam się jak rozwiązać problem obsługi żądań klienta na serwerze (komunikacja oparta na socketach).
Klient może np rozpocząć rozmowę lub wysłać plik, każda ta operacja będzie generować inne polecenie wysyłane do serwera.
Na serwerze można uruchomić wątek dla każdego klienta i napisać nieskończoną pętlę while, która będzie pobierać strumień wejściowy i w zależności od polecenia wykonywać którąś z tych operacji. Ale pojawia się problem- np serwer odebrał polecenie rozmowy i uruchomił wątek odbierający/wysyłający wiadomości. Jednak strumienie płynące od klienta, które będą wiadomościami zostaną odebrane przez pętle while jako polecenie... a jeśli zatrzymam pętle while, to nie będę mógł potem już uruchomić żadnej innej operacji (np rozmowa z innym uzytkownikiem lub wyslanie pliku)...

Po prostu brakuje mi koncepcji, mile widziane jakieś pomysły :)

Pozdrawiam

0

to może w inną stronę. serwer obiera wiadomości według jakiegoś prostego protokołu: id_nadawcy, id_odbiorcy, wiadomość. Według tego kieruje wiadomości do odpowiednich userów i nie potrzebujesz już osobnych wątków dla każdego user, co wydaje się slabym pomysłem.

0

jeżeli w kółko nadajesz lub odbierasz na danym porcie to po prostu blokujesz na nim komunikację. Dlatego w przypadku rozmowy głosowej/strumienia wideo najlepiej byłoby poświęcić na tą usługę osobny port. Jeżeli zaś chcesz jednocześnie np. nadawać wiadomości tekstowe i pliki jednym portem to po prostu przesyłaj naprzemiennie porcje danych do serwera i po stronie usługi serwera rozpoznawaj ich rodzaj np. za pomocą serializacji i subklasowania. (ObjectOutputStream albo XMLEncoder)

0

... czyli serwer powinien mniej więcej wyglądać tak:

po zaakceptowaniu połączenia od klienta tworzę dla niego wątek z nieskończoną pętlą. W niej tworze obiekt klasy np Pakiet (której pola składowe to nadawca, odbiorca, polecenie, wiadomość itd... i owa klasa implementuje interfejs Serializable) do której zapisuje wczytany przez serwer strumień... i teraz piszę rząd if'ów, które w zależności od pola składowego "polecenie" klasy Pakiet będą wykonywać odpowiednie operacje...

chyba się zgadza mniej więcej? :)

jako strumienie wejścia/wyjścia muszę używać ObjectOutputStream/InputStream czy BufferedReader i PrintStream również są odpowiednie?

0
szu napisał(a)

i teraz piszę rząd if'ów
raczej switch

0

różnica w szybkości działania?

0

up

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