konto usunięte

Temat: komunikator - przesyłanie komunikatów - serializowanie...

witam ponownie :)

mam takie pytanie odnośnie komunikatora sieciowego
mam klasę Client, to jest aplikacja klienta
po podpięciu do serwera po stronie klienta jest tworzony obiekt klasy Message [zawiera pola odbiorca, nadawca, hash, wiadomość, data, oraz kilka funkcji: set... i get...]
gdy klient napisze coś w konsoli i wciśnie enter na rzecz obiektu klasy Message wykonywana jest funkcja setContent później serializacja i następnie wysłanie wiadomości do serwera

po stronie serwera cały czas odbierane są pakiety
while(true){
Message myObject = (Message) ois.readObject();
System.out.println(myObject.getContent());
}

czy przesyłanie wiadomości w ten sposób jest optymalne ?? tworzenie za każdym razem nowej instancji klasy Message?
czy może trzeba jakoś inaczej to zrobić?
hmm, i zastanawiam się też jaki warunek mogę sprawdzać zamiast tego while(true)?

proszę o jakąś wskazówkę :)

konto usunięte

Temat: komunikator - przesyłanie komunikatów - serializowanie...

Nie przejmowalbym sie takimi rzeczami jak tworzenie nowych obiektow. Taka specyfika obiektowego programowania, ze tworzy sie duzo obiektow. Z punktu widzenia wydajnosci i tak to bedzie mialo male znaczenie czy je tworzysz czy nie (jezeli ma to znaczenie to moze wogole trzeba sie zastanowic czy Java to dobry wybor technologii do zadania). Jesli Ci zalezy to mozna by sie zastanowic nad przesylaniem informacji - moze warto napisac wlasny mechanizm serializujacy do Twojej klasy?

konto usunięte

Temat: komunikator - przesyłanie komunikatów - serializowanie...

Witam,

Nie wiem na ile zmiejszy to narzut obiektowości, ale możesz spróbować:

while(true){
((Message) ois.readObject()).getContent();
}

Warunek jest jak najbardziej OK.
Zacheusz Siedlecki

Zacheusz Siedlecki Senior Java
Architect, Working
Manager

Temat: komunikator - przesyłanie komunikatów - serializowanie...

Kod
while(true){
Message myObject = (Message) ois.readObject();
System.out.println(myObject.getContent());
}

jest niewątpliwie napisany w lepszym stylu niż:
while(true){
System.out.println(((Message) ois.readObject()).getContent());
}

w drugim przypadku nie dość, że debugowanie byłoby trudniejsze to w dodatku jest mniej czytelnie
czas wykonania będzie ten sam

konto usunięte

Temat: komunikator - przesyłanie komunikatów - serializowanie...

Zacheusz Siedlecki:
Kod
while(true){
Message myObject = (Message) ois.readObject();
System.out.println(myObject.getContent());
}

jest niewątpliwie napisany w lepszym stylu niż:
while(true){
System.out.println(((Message) ois.readObject()).getContent());
}

w drugim przypadku nie dość, że debugowanie byłoby trudniejsze to w dodatku jest mniej czytelnie
czas wykonania będzie ten sam

Witam,

Zgadzam się z tym, iż taki kod będzie mniej czytelny (co do debugowania pewnie też będzie gorszy, aczkolwiek nie jest on zbyt złożony). Czas wykonania będzie pewnie analogiczny, bo jedyne czego się pozbywamy to dorzucenia referencji do obiektu.
Może trochę zaoszczędzilibyśmy tylko pracy dla gc.

konto usunięte

Temat: komunikator - przesyłanie komunikatów - serializowanie...

ok :) dziękuje za zainteresowanie :)

dlaczego pytałem o obiekty, bo zastanawiałem się czy do przesyłania nie użyć np tablicy [o ile by się dało]. W nieoficjalnym opisie protokołu dla komunikatora GG są podane struktury jako nośnik

teraz kolejne pytanie :p
wprawdzie w komunikatorze tego nie wykorzystam bo muszę na serwerze deserializować obiekt, pobierać z niego id odbiorcy, serializować obiekt i przesłać dalej [jeśli cokolwiek o czym piszę można zrobić lepiej to krzyczcie :P uczę się JAVY więc czasami jakieś głupoty mogą się zdarzyć ;) ], ale czy serwer może przesłać zserialiwowany obiekt dalej bez deserializacji? tzn przyjmuje od klienta X i od razu przesyła do klienta Y?

konto usunięte

Temat: komunikator - przesyłanie komunikatów - serializowanie...

Paweł Ryznar:
witam ponownie :)

mam takie pytanie odnośnie komunikatora sieciowego
mam klasę Client, to jest aplikacja klienta
po podpięciu do serwera po stronie klienta jest tworzony obiekt klasy Message [zawiera pola odbiorca, nadawca, hash, wiadomość, data, oraz kilka funkcji: set... i get...]
gdy klient napisze coś w konsoli i wciśnie enter na rzecz obiektu klasy Message wykonywana jest funkcja setContent później serializacja i następnie wysłanie wiadomości do serwera

po stronie serwera cały czas odbierane są pakiety
while(true){
Message myObject = (Message) ois.readObject();
System.out.println(myObject.getContent());
}

czy przesyłanie wiadomości w ten sposób jest optymalne ?? tworzenie za każdym razem nowej instancji klasy Message?
czy może trzeba jakoś inaczej to zrobić?
hmm, i zastanawiam się też jaki warunek mogę sprawdzać zamiast tego while(true)?

proszę o jakąś wskazówkę :)

Ja bym jednak umieścił w warunku pętli jakąś flagę pozwalającą
wyłączyć odczytywanie obiektów ze strumienia, np.

while(!isInterrupted()){
...
}

a w przeciążonej metodzie isInterrupted() zaimplementował
obliczanie wyrażanie zwracającego true|false dla warunku:

public boolean isInterrupted() {
return {jakis_warunek};
}

Oczywiście zakładam, że czytasz obiekty z osobnym wątku.

konto usunięte

Temat: komunikator - przesyłanie komunikatów - serializowanie...

Paweł Grotowski:

Oczywiście zakładam, że czytasz obiekty z osobnym wątku.

z wątkami na serwerze to wygląda tak że podpięcie nowego klienta wywołuje nowy wątek [ wiem że to nie jest optimum ale na razie tak zostanie :P ], ale czy jeden wątek wystarczy gdy klient X będzie rozmawiał z kilkoma użytkownikami w tym samym czasie [ale nie w formie konferencji]. czy to while(true) .... nie "zgubi" przychodzących wiadomości przy dużej ich liczbie. na razie wielowątkowość sprawia mi trochę problemów :( bo nawet nie mam jak sprawdzić czy dobrze zrobiłem, mam nadzieję ze później będzie lepiej

Po stronie klienta tworzone są 2 wątki jeden o odbierania danych, drugi do wysyłania.

konto usunięte

Temat: komunikator - przesyłanie komunikatów - serializowanie...

1) Nie wiem czy dobrze zrozumiałem, ale najlepiej popatrzeć jak ktoś już to robił.

2) A nie myślałeś skorzystać z już gotowych rozwiązań np. RMI, JXTA itp? Kiedyś jakiś komunikator na jakaś laborke pisałem w JXTA jak coś to się odezwij to może się gdzieś znajdzie.

Ogólne pytanie brzmi: co to ma być i czemu służyć :)

3) Jeżeli chodzi o dużą liczbę krótko żyjących obiektów w jakimkoleik programie to ja bym sie tym nie przejmował, jak się okaże po produkcyjnym wdrożeniu że nie bangla to można optymalizować, zaczynając od odpowiedniego odpalenia JVM, poczytaj na necie o optymalizacji GC (NewSize, SurvivourRatio, ...).

EDIT:
punkt 3 oczywiście stosować z rozsadkiem :D :PWojciech Bu.... edytował(a) ten post dnia 31.03.08 o godzinie 22:53

konto usunięte

Temat: komunikator - przesyłanie komunikatów - serializowanie...

ad1. w sumie to nie bardzo wiem skąd taki przykład wziąć :P
ad2. hmm, RMI za to dopiero się zabiorę :) a o JXTA nie znam :P ale na pewno za jakiś czas z chęcią poznam :)
co to ma być? komunikator sieciowy, wykorzystujący serwer, trochę jak gg - jednak cel jest wyłącznie edukacyjny, po prostu chcę ćwiczyć poznane elementy, wątki, sockety, niedługo RMI itd itp

konto usunięte

Temat: komunikator - przesyłanie komunikatów - serializowanie...

Jeżeli to do nauki to polecam książki, książki i książki :)

Jest wiele bardzo fajnych publikacji odnośnie Javy i ogólnie programowania obiektowego. Ja sie nauczyłem, że zamiast coś wymyślać to o wiele mniej bolesne okazuje się podpatrzenie jak inni to robią :) No ale to moje osobiste zdanie. Każdy jest inny i w każdym przypadku może to inaczej wyglądać.

Ten problem wydaje mi się nie jest aż tak Javowy jak ogólnie programistyczny. W wielu językach można by to zaimplementować w ten sam sposób.

konto usunięte

Temat: komunikator - przesyłanie komunikatów - serializowanie...

hmm książki owszem :) mam Java2core zaawansowana, java współbieżność dla praktyków. i jakieś ebooki o'riley "Java Thread" tylko że z 1999 roku [nie za stara?] o'riley Java RMI. w sumie to tak trzeba trochę kodów poprzeglądać, analizować ale wydaje mi się to trochę mało, więc chcę trochę bardziej skomplikowane rzeczy pisać. Problem jest może i ogólnie programistyczny, no ale jak już wybrałem tą platformę to pasuje pisać na nią aplikacje.

a wracając do tematu :P dzisiaj się dowidziałem że pasuje kolekcje użyć w moim programie :D
a co do RMI, czy ma w ogóle sens używanie tego elementu w komunikatorze sieciowym ?

Temat: komunikator - przesyłanie komunikatów - serializowanie...

1) Komunikator tekstowy na RMI tak ale tylko jako prosty przykład szkolny. No chyba, że jeden serwer będzie w tym samym kwancie czasu obsługiwać znaczną ilość klientów (ile nie wiem nikt tego nie policzył) a rozmiar przesyłanego obiektu będzie duży.

2) Co do serializacji to pomyśl przez chwilę. Jeżeli chcesz coś przesłać przez sieć to tak czy inaczej musisz zamienić to na strumień bajtów. Serializacja została wymyślona po to by można było na dysku sprawnie zapisać stan aplikacji w celu jej odtworzenia do identycznego. Więc jedyną optymalizacją może być uproszczenie protokołu komunikacji. Możesz zamiast wysyłać cały obiekt do serwera zdefiniować:
a) znacznik początku komunikatu
b) pola komunikatu (ich kolejność, rozmiar, etc.)
c) znacznik końca komunikatu
Tak przygotowany komunikat wysłać jako strumień bajtów do serwera po stronie którego parser będzie sobie wyciągać te informacje.
Pytanie na jakie sobie musisz odpowiedzieć to czy warto tak komlikować budowę tak prostej aplikacji w celu zaoszczędzenia troszkę mocy obliczeniowej.

3) Komunikator tekstowy z założenia jest aplikacją gdzie przesyłane są małe ilości informacji o krótkim czasie życia.



Wyślij zaproszenie do