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.
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 »
Komentarze
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.
Popularne
Nazwa padła ofiarą szantażystów, inni polscy hosterzy też zagrożeni?
22
Darmowy Internet od Aero2. Jak go zdobyć i jakie są prawdziwe koszta? Instrukcja krok po kroku
11
Programowanie w środowisku Android – wprowadzenie do projektowania aplikacji dla urządzeń mobilnych
17
Premiera Diablo 3 wzbudziła dyskusję na temat gier, które zawsze chcą być online
19
Nowy problem z Windows 8: bootuje się za szybko
10
Amerykańscy rodzice straszeni „e-narkotykami” dostępnymi w Sieci
21
Anonymous upubliczniają 1,7 GB danych wykradzionych Departamentowi Sprawiedliwości USA
12
Blueseed: libertariańska sztuczna wyspa przyciągnęła już ponad sto startupów z całego świata
8
Rewolucja w Firefoksie, nowa łatka czterokrotnie ograniczyła zużycie pamięci
20
Darmowy Internet od Aero2. Jak go zdobyć i jakie są prawdziwe koszta? Instrukcja krok po kroku
11
CVDazzle: makijaż jest w stanie pokonać automatyczne systemy ulicznego monitoringu
3
Programowanie w środowisku Android – wprowadzenie do projektowania aplikacji dla urządzeń mobilnych
17
Ubuntu 12.04 LTS już dostępny: stabilna dystrybucja na następne pięć lat?
28
Zostań webmasterem polskiego rządu, zarobisz na komfortowe życie dla siebie i swojej rodziny
33
Społeczność
anga star za droga ludzie wy myślicie!?Jestem 4 klasistką rodzice się nigdy nie...
Jan Zwyczajnych filmów tak kręcić się nie da co najwyżej krótkie scenki jak w...
piotrek____ @asdfgh - yup, też tak sądzę.
Tak jak wtedy ten przeciek o żołnierzu...
gonzales Javowcy pozdrawiają dotnetowców xD
kaziks Galaxy S II - u mnie po aktualizacji Firefox działa strasznie zacina się...
Doniek Szkoda że strona z demo nie działa - non stop się przeładowuje
bartez Niech zaczną jeszcze bardziej ograniczać programistów, to zdziwią się ilu...
- Najdmen.pl: Konta www z wyłączonym licznikiem transferu od IONIC.pl (1)
- 2BE.PL: [Oferta] Promocja jak złoto w 2BE.PL (1)
- gardius: Dobra hurtownia sportowa (1)
- gardius: Tanie książki gdzie warto kupować? (1)
- Najdmen.pl: PROMOCJA, 500 DOMEN .EU ZA 1 PLN NETTO ! (1)
- VMLine: [Oferta] Serwery VPS Xen-HVM/OpenVZ z darmową administracją (2)
- Marek: Generowanie PDFa (2)
Polecane książki
Praca
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ł |









#1 jarecki 2009-03-20 12:55:22 0
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
#2 GiTS 2009-03-21 21:31:05 0
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)
#3 jarecki 2009-03-22 11:45:52 0
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
#4 rafals 2009-08-04 17:12:01 0
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
#5 rafals 2009-08-04 19:26:26 0
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
#6 Doombringer 2009-11-29 01:14:15 0
IP: 188.122.20.[...] Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.2.15 Version/10.10
#7 Mustafa 2011-01-11 22:23:43 0
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
#8 jsdfjksdfjsdkfnsjkdf 2012-01-03 19:36:16 0
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
#9 hdjduye 2012-02-09 14:50:27 0
IP: 87.207.205.[...] Mozilla/5.0 (Windows NT 6.0; rv:9.0.1) Gecko/20100101 Firefox/9.0.1