publikuj: Opublikuj w wykop.pl Opublikuj we flaker.pl Opublikuj na OSnews.pl Opublikuj w delicious wydrukuj
9 skomentuj »

TAGI: java , programowanie , serwer , klient , kurs , aplikacja internetowa

2008-11-19 15:47  |  Dorota Trajkowska

Kurs Javy. Praktyczne programowanie, część IV – aplikacje sieciowe

Kurs Javy. Praktyczne programowanie, część IV – aplikacje sieciowe

Poprzednie części kursu Javy przedstawiały sposoby tworzenia aplikacji korzystających zarówno z interfejsu tekstowego konsoli, jak i środowiska graficznego. Żaden z utworzonych dotąd w ramach kursu programów nie korzystał jednak z technologii sieciowych. Dlatego w tej części zajmiemy się kolejnym istotnym zastosowaniem języka Java – budowaniem aplikacji sieciowych.

Spis treści

5. Konsolowa aplikacja sieciowa

Nasza pierwsza aplikacja sieciowa będzie się składała z dwóch modułów: programu serwera wysyłającego informację do klienta oraz programu klienta odbierającego od niego informację przesłaną przez sieć. Każdy moduł może być umieszczony na innym komputerze. Aby jednak całość zadziałała, obie maszyny muszą być podłączone do sieci – może to być sieć lokalna albo Internet.

5.1. Prosty serwer

Na początku musimy przygotować program serwera, który będzie wysyłał dane do klienta. W tym celu musimy zaimportować dwa bardzo istotne pakiety Javy: java.io oraz java.net. Pierwszy z nich zawiera klasy odpowiadające za tworzenie strumieni danych, kolejny zaś to pakiet związany z gniazdami sieciowymi.

import java.io.*;
import java.net.*;

Po zaimportowaniu pakietów przystępujemy do implementacji głównej klasy programu o nazwie „Serwer”.

public class Serwer {
    public static void main(String args[]){
                    ....
                    }
            }

Wewnątrz metody main() implementujemy najważniejszą część naszego serwera. Najpierw utworzymy gniazdo sieciowe. Dzięki niemu możliwe będzie połączenie się z serwerem. Za utworzenie gniazda serwera odpowiada klasa SeverSocket, umieszczona, podobnie jak wiele innych klas związanych z połączeniem sieciowym, w pakiecie java.net.

Jeden z konstruktorów tej klasy pobiera jako swój argument numer portu, na którym serwer naszej aplikacji będzie nasłuchiwał. Utworzenie gniazda serwera może jednak zwrócić wyjątek, dlatego musimy przygotować jego obsługę. Jeśli tego nie zrobimy, to nasz program podczas kompilacji zwróci błąd. O tym, że w tym wypadku obsługa wyjątku jest naszym obowiązkiem, informuje nas dokumentacja Javy umieszczona na stronie firmy Sun Microsystems:

Rysunek 34: Według dokumentacji Javy obsługa wyjątku jest obowiązkowa.

Z dokumentacji wynika, że podczas otwierania gniazda może wystąpić błąd wejścia-wyjścia (I/O), dlatego też musimy obsłużyć wyjątek typu IOException. Oczywiście typem nadrzędnym dla tego typu jest typ Exception, zatem i z niego możemy skorzystać. Niemniej ten pierwszy będzie bardziej precyzyjny. Obiekt ServerSocket umieszczamy w bloku try-catch, wyświetlając w catch wiadomość o błędzie, gdyby do niego doszło podczas próby utworzenia gniazda sieciowego.

import java.io.*;
import java.net.*;

public class Serwer {

public static void main(String args[])
{
ServerSocket  gniazdo=null;
try {
       gniazdo=new ServerSocket(8866);    
      }
      catch(IOException e)
                                       {   System.out.println("Nie można utworzyć gniazda serwera.");   }
........
}
            }

Pamiętajmy, że ustalenie numeru portu jest dowolne, ale musi się on mieścić w przedziale od 1 do 65 535. Nie można też korzystać z numerów portów już wcześnie przypisanych do innej aplikacji lub zajętych przez standardowe usługi, takie jak SMTP, POP3 itp.

Kolejnym istotnym krokiem jest utworzenie połączenia z klientem. Połączenie to tworzy się, wywołując metodę accept() dla utworzonego wcześniej gniazda serwera. Powoduje ona rozpoczęcie nasłuchiwania przez serwer. Metoda ta zwraca obiekt klasy Socket, czyli gniazdo połączenia z klientem. Zostanie ono utworzone tylko wówczas, jeśli klient będzie próbował się przyłączyć do konkretnego portu serwera – w wypadku naszej aplikacji do portu 8866. Metoda ta zwrócić może wyjątek IOException, więc i tutaj musimy wprowadzić jego obsługę.

....
Socket polaczenie=null;
....
try {
       polaczenie=gniazdo.accept();    
      }
      catch(IOException e)
                                       {   System.out.println("Nie można nawiązać połączenia z klientem.");   }

Jeśli dojdzie do połączenia z klientem, to powinniśmy je na końcu zamknąć. Służy do tego metoda close() klasy Socket. Oczywiście, i ta metoda może zwrócić wyjątek, który należy obsłużyć.

try {
       polaczenie.close();    
      }
      catch(IOException e)
                                       {   System.out.println("Nie można zamknąć połączenia.");   }

Jeśli chcemy wysłać dane do klienta, zanim zamkniemy gniazdo połączenia, musimy najpierw pobrać strumień wyjściowy. Służy do tego metoda getOutputStream() zwracająca obiekt typu OutputStream z zawierającego klasy reprezentujące strumienie wejścia i wyjścia pakietu java.io.

....
OutputStream  wy=null;
....
try {
       wy=polaczenie.getOutputStream();    
      }
      catch(IOException e)
                                       {   System.out.println("Nie można pobrać strumienia wyjściowego.");   }

W naszej aplikacji zależy nam na tym, aby serwer wysyłał do klienta wiadomość w postaci tekstu. Dobrze jest zatem wykorzystać strumień wyjścia pozwalający na operowanie na łańcuchu znakowym. Obiektem odpowiedzialnym za to jest PrintWriter. Konstruktor tej klasy pobiera strumień wyjściowy klasy nadrzędnej, takiej jak np. OutputStream.

....
PrintWriter  zapis=null;
....
try {
      if(wy!=null) {    
                            zapis=new PrintWriter(wy);    
                            }
      }
      catch(Exception e)
                            {   System.out.println("Nie można utworzyć strumienia wyjściowego PrintWriter.");   }

«poprzednia 1 2 3 4 ... 9 następna »

publikuj: Opublikuj w wykop.pl Opublikuj we flaker.pl Opublikuj na OSnews.pl Opublikuj w delicious wydrukuj
9 skomentuj »

Komentarze

  • jarecki

    #1 jarecki 2009-03-20 12:55:22 0

    czy komuś działa poprawnie 2 i 3 program

    IP: 89.77.149.[...] Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; pl; rv:1.9.0.7) Gecko/2009021906 Firefox/3.0.7

  • GiTS

    #2 GiTS 2009-03-21 21:31:05 0

    nie dziala i nie chce działać

    widzę, że muszę to zrobić po swojemu :P Jak mi sie uda może dam znać :)

    IP: 212.87.229.[...] Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2a1pre) Gecko/20090321 Minefield/3.6a1pre (.NET CLR 3.5.30729)

  • jarecki

    #3 jarecki 2009-03-22 11:45:52 0

    w takim razie czekam na wieść

    IP: 89.77.149.[...] Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; pl; rv:1.9.0.7) Gecko/2009021906 Firefox/3.0.7

  • rafals

    #4 rafals 2009-08-04 17:12:01 0

    juz ktorys raz tutaj trafiam na kod, ktory pomimo tego, ze zostal udostepniony czytelnikom nie zostal uprzednio sprawdzony.. Nie rozumiem tego postepowania. Na poczatku kurs wydawal mi sie bardzo dobry, teraz widze jego braku, niedociagniecia i razace bledy. Byc moze jest on i dobry, ale tylko an sam poczatek poczatkow.. chociaz i tego pewien bym nie był. 

    Jeżeli ktoś sobie nie radzi z poprawieniem kodu programu drugiego, mogę w jakiś sposob udostepnic swoj, napisany wedlug mnie o wiele lepiej - a sam jeszcze chwile temu sie tego uczylem.

    IP: 83.14.205.[...] Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.39 Safari/530.5

  • rafals

    #5 rafals 2009-08-04 19:26:26 0

    hm, tak na szybko, program trzeci będzie działał, jeżeli po stronie klienta i serwera zamiast:

    zapis.writeBytes(cosTamcosTam + " ");

    wpiszemy 

    zapis.writeBytes(cosTamcosTam + "\n");

    wytłumaczenie:

    Zarówno po stronie klienta jak i serwera, pobierajac jakis napis, wywolujemy metode 

    readLine();

    która to, czyte te dane od klienta/serwera, az napotka znak konca lini, czyli walsnie "\n" a nie znak spacji " ".  Nie działało właśnie dlatego, że ktoraś ze stron zawsze czekała an znak konca lini, ktorego nie dostawala.

    rece opadaja:/

    pozdrawiam

    Rafał Sereda

    IP: 83.14.205.[...] Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/2.0.172.39 Safari/530.5

  • Doombringer

    #6 Doombringer 2009-11-29 01:14:15 0

    rafals: Dzięki za podpowiedź. Takze uczę sie Javy i od kilku dni siedze nad problemem i nie skojarzyłem że musi być znak końca linii. Dopiero Twoja podpowiedź sprawiła ze program działa.

    IP: 188.122.20.[...] Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.10

  • Mustafa

    #7 Mustafa 2011-01-11 22:23:43 0

    Ja chciałbym ten program przerobić tak, żeby można było na serwer przesyłać wiadomość e-mail z klienta pocztowego. Serwer tłumaczyłby wiadomość i przygotowywał ją do wysłania za pomocą protokołu pop3, którą użytkownik mógłby sobie pobrać.

    Czy ktoś mógłby mi udzielić wskazówek jak się za to zabrać?

    IP: 149.156.124.[...] Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101216 Linux Mint/1 (Debian) Firefox/3.6.13

  • jsdfjksdfjsdkfnsjkdf

    #8 jsdfjksdfjsdkfnsjkdf 2012-01-03 19:36:16 0

    Można prosić o linki do sprawdzonych plików źródłowych?

    IP: 93.105.130.[...] Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7

  • hdjduye

    #9 hdjduye 2012-02-09 14:50:27 0

    Czy ma ktoś program 3 albo 2 w wersji działającej?

    IP: 87.207.205.[...] Mozilla/5.0 (Windows NT 6.0; rv:9.0.1) Gecko/20100101 Firefox/9.0.1

Uwaga! Możesz zarejestrować się w serwisie i w ten sposób zarezerwować swój nick oraz ominąć konieczność ciągłego odczytywania wyrazów.

Aby dodać komentarz, musisz podać swój nick, treść komentarza oraz poprawnie przepisać oba słowa z obrazka (słowa muszą być rozdzielone spacją).
W treści komentarza można używać języka formatowania BBcode.

Polecane książki

Czytaj Webhosting

Chcesz być na bieżąco z naszymi informacjami? Zapisz się na Newsletter.

Zarejestruj domenę

Sprawdź dostępność swojej domeny:

.pl: 0 zł   .com: 19.90 zł
.com.pl: 0 zł   .eu: 19.90 zł