chat w rmi - rmiregistry po stronie serwera i klienta?

0

Piszę prosty czat w RMI.

Jest serwer i są klienci.

Czy po stronie klientów też muszą być uruchomione rmiregistry, bo nie mogę sobie poradzić z tym, żeby z serwera uruchomić zdalnie metodę klienta, która wypisuje na terminalu klienta stan rozmowy(np. nadejscie nowej wiadomości od użytkownikow).

Proszę o wskazówki.

0

Tak muszą być uruchomione rmiregistry.

Czemu w RMI ? Spokojnie można naklepać to to na socketach a nawet jest gotowiec w książce
pt "Java receptury".

0

W RMI, gdyż taki jest temat zadania, które muszę napisać na zajęcia.

I mam jeszcze pytanie. Załóżmy, że serwer jest cały czas taki sam i znam jego IP oraz nazwę związaną z obiektem w serwerowym rmiregistry, więc tu nie ma problemu. Ale skoro klientów będzie kilku, to skąd serwer ma wiedzieć jakie jest ich IP oraz jakie mają ustawione nazwy w swoich rmiregistry??
Jak serwer może uzyskać IP łączącego się klienta oraz dane o jego rmiregistry?

dzieki za pomoc:)

0

dziwne zadanie, bo z zaloenie RMI to zdalne wywolywanie metod :| UDP tez sie raczej nie nadaje - wiec sockety to najlepszy pomysl....
a jesli koniecznie musisz, no nawiaz polaczenie na socket'cie i wyslij swoj adres IP jako String przez ObjectOutputStream.
adres pozesz pobrac InetAddress'em

pozdrawiam

0

1.Komp, na którym testuję klasę InetAddress ma dwa interfejsy sieciowe = karta sieciowa(połaczenie lokalne z innym kompem) oraz modem do neostrady. Neostrada cały czas włączona. I teraz, jesli siec lokalna wylaczona(czyli np. 2 komp wylaczony) metoda getLocalHost() zwraca mi nazwę hosta oraz adres Ip "zewnętrzny" 87.xx.yy.zz. Jesli uruchomię sieć lokalną (włączę drugi komp) ta sama metoda zwraca mi nazwę hosta oraz adres ip "wewnętrzny" 192.168.xx.yy. Od czego to zależy to jaki adres dostanę (zewn czy wewn)??? Czy metoda getLocalHost zawsze w pierwszej kolejności zwraca adres wewnętrzny????

2.Czy rzeczywiście muszę używać socketów?. Może wystarczy, że klient wywoła zdalnie na serwerze metodę (dodającą go do zalogowanych użytkowników),przekazując jednocześnie w parametrze np. swój nick oraz adres IP, dobrze myślę ???

0

A nie mozna jakos tak?
Klient laczy sie z serverem, pobiera stuba obiektu na serverze. Wywoluje na nim metode np register, jako parametr tej metody klient by przekazywal swoj obiekt ktory jest remote oraz nicka. Metoda reister jakos zapamieta sobie ten obiekt (np dp mapy, kluczem bylby nick). Ten kliencki obiekt ma metody typu sendMsg(String msg), ktora bylaby wywolywana przez obiekt servera. Obiekt servera ma metode sendMsg(String, nick) - ktora w mapie wyszuka obiekt kliencki po nicku, i jesli taki znajdzie to wywola na nim metode sendMsg(String). Ta metoda bylaby wywolywana przez innych klientow czatu. Mozna od razu zrobic taka prosta usluge wyszukiwania klientow czatu poprzez nicki - dzieki mapie. No i jakis inny klient, ktory tes sie zarejestrowal, otrzyma sobie no potwierdzenie ze "jurek" jest na czacie. No i wywoluje na obiekcie servera (na jego stubie) metode sendMsg("Czesc jurek", "Jurek"), serverowy obiekt wyszuka sobie obiekt ktory zarejestrowal dla nicka "jurek", i wywola na nim metode sendMsg("Czesc jurek"). No i klient jurka, na ktorym wywolana zostanie ta metoda dostanie string czyli woadomosc.
W ten sposob mozna tez latwo zrobic np pokazywanie statusow ze nowa osoba dolaczyla do chatu czy ze ktos odszedl - kwestia nowych metod.
pozdro

0

aha no i to eliminuje koniecznosc rmiregistry na klientach, bo to moim zdaniem zly pomysl w ogole jest. Wystarczy obiekt serverowy, ktory jako parametr dostanie inny obiekt remote i juz.

0

pikseloza, rozumiem o co Ci chodzi, ale nie umiem sobie poradzić z przesłaniem w parametrze obiektu klienckiego do serwera. Jeśli nie implementuję Serializable w obiekcie klienckim to sypie wyjątkami java.io.NotSerializableException, java.rmi.MarshalException itp. Oczywiście jak implementuje Serializable, to wszystko wywołuje się po stronie serwera. Dodam, ze moja klasa kliencka ChatClientImpl implementuje interfejs ChatClient, który wygląda tak:

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface ChatClient extends Remote{
	
	public void receiveMessage(String nickname, String message) throws RemoteException;
// serwer ma wywołać zdalnie tą metodę
//ta metoda drukuje na ekranie wiadomosc(message) od jakiegos uzytkownika(nickname) 
	
}

I teraz chciałbym po stronie serwera wywoływać tą metodę receiveMessage, która drukuje na ekranie u klienta wiadomości.

Do serwera przesyłam obiekt ChatClientImpl metodą createSession(ChatClient client,String nick).
I tutaj właśnie się wysypuje, działa tylko jak implementuje Serializable ale wtedy wyświetla wiadomości po stronie serwera tylko...........

Ta metoda ładnie działa, jeśli rmiregistry był po stronie klienta, teraz po modyfikacjach jest tak jak wyżej napisałem

pozdrawiam i prosze o wskazówki..:)

0

Ok, już działa. Może napiszę, czemu nie działało:)
1)w definicji metody zdalnej była operacja IO (println)
2)klasa kliencka nie dziedziczyła z UnicastRemoteObject

pozdrawiam:)

0
jvx napisał(a)

Ok, już działa. Może napiszę, czemu nie działało:)
1)w definicji metody zdalnej była operacja IO (println)
2)klasa kliencka nie dziedziczyła z UnicastRemoteObject

pozdrawiam:)

Cześć!
Możesz gdzieś ten swój chat udostępnić, bo sam się w sumie męczę z podobnym programem.
Z góry dzięki

0

ok nie ma sprawy....a co dokładnie robisz? :-) zrobię to jutro bo w tej chwili nie mam dostępu do plików, pzdr

0

aaa i tutaj masz dobry poradnik http://java.sun.com/developer/onlineTraining/rmi/RMI.html,
a dokładnie o tym co się męczyłem, czyli o client-side callbackach jest tutaj fajny przyklad:
http://java.sun.com/developer/onlineTraining/rmi/exercises/RMICallback/index.html

0
haquim napisał(a)

Tak muszą być uruchomione rmiregistry.

Czemu w RMI ? Spokojnie można naklepać to to na socketach a nawet jest gotowiec w książce
pt "Java receptury".

Jesli mozesz to powiedz mi jak przekazac wartoscz textFiled do strumienia ktory pozniej wysylam na server.

A moze jak powinien wygladac strumien ktory pobiera wartosc z textField bo sidze juz 2 godziny i nie moge dojsc jak to ma byc. Tez pisze czat:)

0
jvx napisał(a)

ok nie ma sprawy....a co dokładnie robisz? :-) zrobię to jutro bo w tej chwili nie mam dostępu do plików, pzdr

Co prawda na zajęciach mieliśmy coś ala bankomat w RMI. Z tym że ten bankomat składał się tylko z jednego serwera i kilku klientów. Później zastanawiałem się w jaki sposób zrobić tak, aby stworzyć sieć serwerów, z których każdy mógłby być klientem. Trochę to pokićkane ale nie wiedziałem w jaki sposób to obejść. No i dałem sobie z tym spokój. Teraz się uparłem zeby zrobić czata i umieścić go gdzieś na ftp zeby zobaczyć jak to będzie działać, no niestety z tym też sobie nie mogę poradzić. Wkurza mnie te całe RMI a chciałem się czegoś o tym dowiedzieć. Może po zabawie z tym czatem wróce do bankomatów. Zobaczymy :)
Z góry dzięki
Pozdr.

0

mam wielka prozbe głównie do JVX jest mozliwe żebys udostępnił mi te pliki chat w rmi bo tez musze cos takiego napisac i nie mam pojecia jak

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