Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Java - multichat - multiczat

Dr. Ma 30 Maj 2010 15:23 1599 8
  • #1 30 Maj 2010 15:23
    Dr. Ma
    Poziom 12  

    Witam,

    Panie i Panowie, muszę napisać co robi server i klient komunikując się między sobą w multiczacie, musi to być opracowanie teoretyczne (polonistycznie) ze wstawkami (klasami, metodami) javowymi. W załączniku przesyłam to co do tej pory napisałem, prośba o ocenę i pomoc w dalszej walce z tym oto problemem. Pozdrawiam

    0 8
  • #2 30 Maj 2010 15:42
    Dżyszla
    Poziom 42  

    Szczerze, to nie widzę tego wcale po tym opisie.

    Przede wszystkim musisz po stronie serwera nasłuchiwać, to fakt, ale zaraz po nawiązaniu połączenia musisz przekazać na oddzielny wątek dalszą komunikację. Inaczej czat zadziała tylko z jedną osobą.

    Dalej komunikacja odbywa się w ten sposób, że klient wysyła dane, lecz równocześnie na osobnym wątku nasłuchuje danych z serwera. Ten po odebraniu danych wysyła je do pozostałych podłączonych użytkowników.

    Na koniec klient zamyka połączenie, a w odpowiedzi na to, serwer rozsyła informację do pozostałych o wylogowaniu się klienta i usuwa jego wątek ze sowich zasobów.

    0
  • #3 31 Maj 2010 13:46
    Dr. Ma
    Poziom 12  

    Czy w takim wypadku mógłbym prosić o pomoce naukowe lub wskazanie książki, z której mógłbym tą wiedzę zaczerpnąć.

    0
  • #7 03 Cze 2010 11:54
    Dr. Ma
    Poziom 12  

    Bradzo przepraszam za niedogodnośnie.

    Code:

    SERWER.

    1.   Tworzenie gniazda  – tutaj wykorzystujemy klasę ServerSocket
    ServerSocket = new ServerSocket(8189);

    2.   Program oczekuje na klienta, który połączy się do portu. Jeżeli się połaczy to metoda ta zwróci obiekt klasy Socket prezentujący utworzenie połaczenia:
    Socket incoming = s.accept();

       (

    ServerSocket – obietk wykorzystywany przez serwer do czekania na klienta, służy do nasłuchiwania klienta

    Podstawowa metoda ServerSocket jest akcept();

    Metoda ServerSocket zawiesza działanie serwera do czasu zgłoszenia się klienta, po zgłoszeniu klienta zwraca ona obiekt typu Socket, który służy do połaczenia się z klientem

    Socket obiekt służący klientowi do połaczenia z serwerem, jak również serwerowi do rozmowy z klientem


    )
    3.   Po wykonaniu metody accept będzie nowe gniazdo utworzone, uruchomiony nowy wątek do obsługi nowego klienta, natomiast program główny powróci do stanu oczekiwania, gówna pętla programu wygląda tak:
    while(true)
    {
    Socket incoming = s.accept();
    Runnable r = TheadedEchoHandler(incoming);
    Thread t = new Thread
    t.start();
    }
    Klasa  TheadedEchoHandler implementuje interfejs Runnable i zwraca wnętrze metodu run, w której rozpoczyna się komunikacja z klientem
    public  TheadedEchoHandler inplements Runnable
    {
    public void run()
    {
    try
    {

    InputStream inStream = incoming.get InputStream();
    OutputStream inStream = incoming.get OutputStream()
    Przetwarzanie danych wejściowych I wysyłanie odpowiedzi
    incoming.close();
    }
    Catach (Exception e)
    }

    }

    }

    4.   Czytanie strumienia wyjścia wejścia
    InputStream inStream = incoming.get InputStream();
    OutputStream inStream = incoming.get OutputStream()

    Każde połączenie powoduje uruchomienie nowego wątku

     Klasa InputStream podstawowy strumień wejściowy
    Klasa OutputStream podstawowy strumień wyjściowy



    5.   Konwersja strumienia wejścia wyjścia obiektów klasy Scaner i PrintWriter.
    Scanner in = new Scanner(inStream)
    PrintWriter out = new PrintWriter(outWriter)

    6.   Zamknięcie gniazda
    Incoming.close();



    0
  • #8 03 Cze 2010 14:21
    gaskoin
    Poziom 38  

    Dr. Ma napisał:

    SERWER.

    Metoda ServerSocket zawiesza działanie serwera do czasu zgłoszenia się klienta, po zgłoszeniu klienta zwraca ona obiekt typu Socket, który służy do połaczenia się z klientem


    ServerSocket nie jest metodą, ale podejżewam, że chodziło Ci o to, że "metoda accept obiektu ServerSocket zawiesza działanie programu...."

    Dr.Ma napisał:


    Code:
    while(true)
    
    {
    Socket incoming = s.accept();
    Runnable r = TheadedEchoHandler(incoming);
    Thread t = new Thread
    t.start();
    }

    Klasa  TheadedEchoHandler implementuje interfejs Runnable i zwraca wnętrze metodu run, w której rozpoczyna się komunikacja z klientem
    public  TheadedEchoHandler inplements Runnable
    {
    public void run()
    {
    try
    {

    InputStream inStream = incoming.get InputStream();
    OutputStream inStream = incoming.get OutputStream()
    Przetwarzanie danych wejściowych I wysyłanie odpowiedzi
    incoming.close();
    }
    Catach (Exception e)
    }

    }

    }



    Najpierw błędy w kodzie, bo chyba mało co piszesz w Javie, na dodatek nie sprawdzasz jego poprawnosci.

    Po 1. Nie możesz zrobić czegos takiego:

    Code:
    Runnable r = TheadedEchoHandler(incoming);


    zawsze przed STWORZENIEM nowego obiektu musi być operator new. Poza tym, tworzac nowa klase, w Twoim przypadku TheadedEchoHandler, a przypisujac ja do obiektu Runnable, uniemożliwiasz sobie wykorzystanie jej publicznych klas (o ile są).
    albo możesz zrobić coś takiego (jeżeli ich niepotrzebujesz):

    Code:
     Runnable r = new Runnable() {
    
                public void run() {
                    cośtam
                }
            };
           
            new Thread(r).start();


    albo lepiej takiego:

    Code:
    TheadedEchoHandler r = TheadedEchoHandler(incoming);
    
    Thread t = new Thread(r);
    t.start


    lub jezeli obiekt watku nie jest Ci do niczego potrzebny (a pewnie nie bedzie) to od razu:

    Code:
    TheadedEchoHandler r = TheadedEchoHandler(incoming);
    
    new Thread(r).start();


    Po 2. przeanalizuj swój kod:
    akceptujesz polaczenie z klientem, ok. Odpalasz watek, ok. W wątku pobierasz strumienie wyjścia wejścia, swietnie. Po czym przerabiasz dane i rozłączasz klienta :) w ten sposob klient wyśle i jak dobrze pojdzie, odbierze tylko 1 wiadomosc po czym zostanie wywalony. Przemysl to jeszcze.

    0
  • #9 04 Cze 2010 18:27
    Dr. Ma
    Poziom 12  

    Witam,

    A oto mi mój klient, prośba o informacje co o tym myślicie.

    Może kilka słów początku.

    Code:


    Klient tworzy 3 strumienie i 1 gniazdo. Gniazdo nosi nazwę clientSocket. Strumień inFromUser jest strumieniem wejśćiowym programu związanym z urządzeniem wejśćia czyli klawiaturą. [code]inFromServer[/code] jest kolejnym strumieniem programu powiązanym z gniazdem. Znaki zawarte w tym strumieniu przesyłane są siecią. Strumień outToServer jest strumieniem wyściowym skojarzonym z gniazdem. W tym strumieniu znajdują się znaki wysyłane przez klienta.



    Wykorzystujemy w kliencie pakiety:
    Code:

    java.io - klasy strumieni wejśćia wyjścia, posiada klasy BufferedReader oraz DataOutputStream, które wykorzystujemy do trzech strumieni wcześniej utworzonych
    java.net - klasy obsługujące sieć, zawiera Socket, ServerSocket, clientSocket jest obiektem klasy Socket


    Potem zrealizujemy:

    Code:

    zadeklarowano obiekt typu string.
    String sentence  jest łańcuchem wprowadzanym przez użytkownika i wysyłąnym do serwera
    String modifiedSentence ten obiekt natmiast jest łańcuchem pobieranym z serwera i przekazywanym do standardowego urządzenia wyjśćia użytkownika.


    Poniższy kod wykorzystujemy do tworzenia obiektustrumienia inFromUser typu BufferedReader. Strumień wejściowy jest inicjaliwowany za pomocą pola System.in, który łączy strumień ze standardowym urządzeniem wejścia. Instrukcja umożliwia wczytywanie znaków za pomocą klawiatury.
    Code:

    BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));

    Następnie:

    Code:

    Socket clientSocket = new Socket();

    jest tutaj tworzony obiekt clientSocket typu Socket.
    Następnie tworzymy obiekty strumienia powiązanego z gniazdem.outToServer pozwala przekazać dane do gniazda. inFromServer pobiera dane z gniazd
    Code:

    DataOutputStream outToServer = new DataOutputSream(clientSocket.getOutputSream());
    BufferedReade inFromServer = new BufferedReader (new InputSreamReader(clientServer.getInputStream()));


    Może następnie wykonać coś takiego:

    Code:

    sentence = inFromUser.readLine();

    umieszczamy sekwencję znaków wprowadzanych przez użytkownika w łańcuchu sentence. Znaki za pośrednictwem strumienia inFromUser są przekaznywane ze standardowego wejścia do łańcucha sentence.

    No i:

    Code:

    clientSocket.close();

    Wiersz zamyka gniazdo i kończy połączenie

    0