Stanąłem przed takim oto problemem :
Potrzebuję napisać mechanizm w programie, który sprawia, że kolejne instancje tego samego programu potrafią się komunikować ze sobą na tym samym komputerze rozsyłając pomiędzy sobą obiekt typu ArrayList.
Dlaczego nie Remoting ?
- ponieważ o ile można sprawić żeby pierwszy program uruchomił się jako serwer a reszta pracowała jako klienty, to nie da się sprawić żeby trzeci z uruchomionych programów mógł rozesłać obiekt ArrayListy do innych klientów i serwera, a potem na przykład żeby drugi czy czwarty zrobił to samo. Zawsze jeden jest serwerem, reszta jest klientami i jedynie klienci mogą wywoływać zdalne metody na serwerze (czyli defakto każdy z klientów musiałby się sam dopominać o ten obiekt od serwera, który to może nie mieć aktualnej wersji tego obiektu - czyli tej listy).
Dlaczego nie TcpListener i TcpClient ?
- wszystko ładnie wygląda i serwer może rozsyłać sam obiekty do wszystkich programów ustawionych jako klienty podpięte do tego samego portu.
Problem zachodzi wówczas gdy to jeden z klientów nagle ma zaktualizowany obiekt listy i musi go rozesłać do innych klientów i serwera.
Nie da się, ponieważ klient nie może od tak stać się serwerem dla reszty klientów podpiętych do tego samego portu. Jest tak dlatego, że już jest jeden serwer na tym porcie i wyłączenie go by jeden z klientów mógł się stać serwerem a wcześniejszy serwer klientem (żeby także mógł odebrać tą listę) jest niemożliwe (chyba, że jest - ale mi się to nie udało).
Czego potrzebuję ?
- potrzebuję czegoś co jednocześnie umożliwi mi bycie klientem, który nie będzie wymagał tego by wcześniej został odpalony na tym porcie serwer (jak w remotingu), ale jednocześnie będzie takim TcpListenerem, który będzie mógł rozesłać obiekt do reszty klientów podpiętych do tego portu.
Czy jest w ogóle taki mechanizm ? Wiem, że w Javie da się zrobić coś podobnego bez skomplikowanej budowli programowej i jeszcze bardziej zamotanego algorytmu.
PS: Wiem, że wszystko się da i można wymyślij super-mega skomplikowany algorytm, który będzie korzystał na raz z 10 portów, Remotingu, TcpClienta i Listenera jednocześnie - ale nie o to chodzi. Na pewno jest prostszy sposób na to. Ktoś na pewno przewidział taką możliwość.
Bardzo proszę Was o pomoc! Może ktoś ma jakieś pomysły/wskazówki dla mnie?