Ettiotte Rusty Harold
Java. Programowanie sieciowe
Tytuł oryginału: Java Network Programming, Second Edition ! '
Tłumaczenie: Katarzyna Tryc (rozdz. 1-10), Grzegorz Werner (rozdz. 11-19)
Wydawnictwo RM, Warszawa 2001
Authorized translation of the English edition 2000 0'Reilly and Associates, Inc. This translation
is published and sold by permission of 0'Reilly and Associates, Inc., the owner of all rights
to publish and sell the same.
Wydawnictwo RM, 00-987 Warszawa 4, skr. poczt. 144
rm@rm.com.pl
www.rm.com.pl
Żadna część tej pracy nie może być powielana i rozpowszechniana, w jakiejkolwiek formie i w jakikolwiek sposób (elektro-
niczny, mechaniczny) włącznie z fotokopiowaniem, nagrywaniem na taśmy lub przy użyciu innych urządzeń, bez pisemnej
zgody wydawcy.
Wszystkie nazwy handlowe i towarów występujące w niniejszej publikacji są znakami towarowymi zastrzeżonymi lub na-
zwami zastrzeżonymi odpowiednich firm odnośnych właścicieli.
Nazwy i adresy firm, nazwiska i adresy osób, nazwy towarów i inne dane wykorzystane w przykładach są fikcyjne i jakakol
wiek zbieżność z rzeczywistością jest wyłącznie przypadkowa.
Wydawnictwo RM dołożyło wszelkich starań, aby zapewnić najwyższą jakość tej książce. Jednakże nikomu nie udziela
żadnej rękojmi ani gwarancji. Wydawnictwo RM nie jest w żadnym przypadku odpowiedzialne za jakąkolwiek szkodę (łącz-
nie ze szkodami z tytułu utraty zysków związanych z prowadzeniem przedsiębiorstwa, przerw w działalności przedsiębior-
stwa lub utraty informacji gospodarczej) będącą następstwem korzystania z informacji zawartych w niniejszej publikacji,
nawet jeśli Wydawnictwo RM zostało zawiadomione o możliwości wystąpienia szkód.
ISBN 83-7243-135-3
Redaktor prowadzący: Danuta Cyrul
Redakcja: Irmina Wala-Pegierska
Korekta: Krystyna Knap
Indeks: Katarzyna Tryc
Opracowanie graficzne okładki według oryginału: Grażyna Jedrzejec
Redaktor techniczny: Beata Donner-Soska
Skład: Artur Wólkę
Druk i oprawa: Oficyna Wydawnicza READ ME - Drukarnia w Lodzi
Wydanie l
10987654321
Mojej Babuni, wspanialej babci
Spis treści
Wstęp. ....................................................... XI
Uwagi do wydania drugiego .......................................... XII
Układ książki. .................................................. XIII
Kim jesteś? .................................................... XVI
Wersjejavy ................................................... XVII
Bezpieczeństwo ................................................. XIX
Uwagi na temat przykładów .......................................... XIX
Konwencje zastosowane w tej książce. ..................................... XX
Prośba o komentarze .............................................. XXII
Podziękowania. ........................................ ..... ....... XXIV
Rozdział 1: Dlaczego Java sieciowa?................................ 1
Co potrafi program sieciowy? ........................................... 2
Chwileczkę! Jeszcze coś! ............................ . .V -'.!Vi --j / . v". i(. .... 19
Rozdział 2: Podstawowe pojęcia dotyczące sieci. ........................ 21
Sieci......................................................... 21
Warstwy sieci ................................................... 23
Protokoły IP, TCP oraz UDP ........................................... 29
Internet ....................................................... 32
Model klient-serwcr. .............................. . . ............... 38
Internetowe standardy ............................. , ................ 40
.- ;'.".:.": ' -;r< v&jij
Rozdział 3: Podstawowe pojęcia dotyczące sieci WWW. .................... 51
URI ......................................................... 52
HTML,SGMLiXML ............................................... 58
HTTP ........................................................ 60
MIME. ....................................................... 65
CGI ......................................................... 70
Aplcty i bezpieczeństwo .............................. ;-..vVi'i. ...... 73
Rozdział 4: Wejście i wyjście w Javie ............................... 77
Strumienie wyjściowe............................................... 78
Strumienie wejściowe ............................................... 82
Strumienie filtrujące................................................ 86
KlasyReaderiWriter. .............................................. 102
Rozdział 5: Wątki ......................................... 117
Działające wątki ................................................. 119
Informacje zwracane przez wątki. ....................................... 123
Synchronizacja .................................................. 135
Zakleszczenie. .................................................. 141
Harmonogram wątków ............................................. 142
Pulawątków ................................................... 156
Rozdział 6: Wyszukiwanie adresów internetowych ....................... 163
DNS, adresy IP i cała reszta ........................................... 163
Klasa InetAddress ................................................ 165
Kilka przydatnych programów ......................................... 177
VIII
Spis treści
Rozdział?: Odnajdywanie danych za pomocą adresów URL. ................. 189
Klasa URL. .................................................... 189
Klasy URLEncoder i URLDecoder ....................................... 212
Komunikowanie się z programami CGI i serwletami metodą GET . ....................... 216
Dostęp do witryn zabezpieczonych hasłem .................................. 221
Rozdział 8: HTML w Swingu ................................... 229
HTML w komponentach. ............................................ 230
Klasa JEditorPane ................................................ 232
Parsowanie HTML-a . .............................................. 240
Rozdział 9: Metody sieciowe klasy java.applet.Applet ..................... 257
Wykorzystanie klasy jaya.applet.Applet do ładowania danych ........................ 257
Interfejs ImageObserver ............................................. 265
Klasa MediaTrackcr ............................................... 270
Sieciowe metody interfejsu java.appIct.ApplctContext. ...........,; ...... ."'. ,,.,.. 285
Rozdział 10: Gniazda klientów .................................. 289
Podstawy gniazd................................................. 290
Podglądanie protokołów za pomocą Telnetu ................................. 290
KlasaSocket. ................................................... 292
Wyjątki klasy SocketException ......................................... 314
Przykłady ..................................................... 315
Rozdział 11: Gniazda serwerów ................................. 333
Klasa ScrverSocket................................................ 334
Kilka przydatnych serwerów .......... . , , .... .......................... 346
Rozdział 12: Bezpieczne gniazda. ................................ 367
Bezpieczna komunikacja. ............................................ 368
Tworzenie bezpiecznych gniazd klienta .................................... 371
Metody klasy SSLSocket. ............................................ 375
Tworzenie bezpiecznych gniazd serwera ................................... 381
Metody klasy SSLSeryerSocket ......................................... 385
Rozdział 13: Gniazda i datagramy UDP ............................. 389
Protokół UDP .................................................. 389
Klasa DatagramPacket. ............................................. 391
Klasa DatagramSocket. ............................................. 400
Kilka przydatnych aplikaq'i ........................................... 411
Rozdział 14: Gniazda multicast. ............................... . . 425
Co to jest gniazdo multicast? .......................................... 426
Praca z gniazdami multicast. .......................................... 436
Dwa proste przykłady .............................................. 440
Rozdział 15: Klasa URLConnection ............................... 445
Otwieranie połączeń URLConnection ..................................... 446
Czytanie danych z serwera ........................................... 448
Czytanie nagłówka ............................................... 449
Konfigurowanie połączenia .......................................... 457
Konfigurowanie nagłówka MIME w żądaniu klienta ........................... 465
Wysyłanie danych do serwera ......................................... 467
Spis treści
IX
Programy obsługi treści. ............................................ 472
Metody obiektowe. ............................................... 474
Uwagi o bezpieczeństwie obiektów URLConnection. ........................... 474
Odgadywanie typów MIME. .......................................... 475
HttpURLConnection. .............................................. 478
JarURLConnection................................................ 492
Rozdział 16: Programy obsługi protokołu ............................ 495
Co to jest program obslugi protokołu? ..................................... 496
Klasa URLStreamHandler. ........................................... 499
Pisanie programu obslugi protokołu ...................................... 506
Inne przykłady programów obsługi protokołu ................................ 511
Interfejs URLStreamHandlerFactory . ..................................... 519
Rozdział 17: Programy obsługi treści .............................. 523
Co to jest program obsługi treści? ........................................ 525
Klasa ContentHandler .............................................. 528
Interfejs ContentHandlerFactory ........................................ 539
Program obsługi treści dla formatu graficznego image/x-fits ........................ 542
Rozdział 18: Zdalne wywoływanie metod (RMI). ........................ 555
Co to jest zdalne wywoływanie metod? .................................... 555
Implementacja .................................................. 561
Lądowanie klas w czasie wykonania ...................................... 569
Pakiet java.rmi ................................................. 576
Pakiet java.rmi.registry ............................................. 584
Pakiet java.rmi.server .............................................. 586
Rozdział 19: JavaMail API. .................................... 591
CotojestJavaMailAPI? ............................................. 592
Wysyłanie poczty. ................................................ 594
Odbieranie poczty ................................................ 604
Uwierzytelnianie za pomocą haseł ....................................... 609
Adresy. ...................................................... 613
Klasa URLName ................................................. 617
Klasa Message .................................................. 619
Interfejs Part. ................................................... 630
Wiadomości wieloczęściowe i załączniki plikowe .............................. 640
Wiadomości MIME. ............................................... 644
Foldery ...................................................... 646
Indeks. ............................................... 659
Wstęp
Rozwój Javy w ciągu ostatnich pięciu lat jest zjawiskiem niezwykłym. Trochę za-
dziwia fakt, że Java w krótkim czasie spowodowała wzrost znaczenia sieci i po-
wszechne zainteresowanie nimi, skoro programowanie sieciowe w Javie dla wielu
osób jest nadal czymś bardzo tajemniczym. Ale tak nie musi być. W rzeczywistości
pisanie programów sieciowych w Javie jest dość proste, co ilustruje ta książka. Czy-
telnicy o pewnym doświadczeniu w programowaniu sieciowym w Uniksie, syste-
mie Windows bądź środowisku Macintosha będą mile zaskoczeni tym, o ile łatwiej-
sze w Javie jest napisanie równorzędnych programów. Dzieje się tak dlatego, że klu-
czowe API Javy zawiera dobrze zaprojektowane interfejsy do większości funkcji sie-
ciowych. Tak naprawdę istnieje niewiele oprogramowania sieciowego warstwy
aplikacji, które łatwiej byłoby napisać w języku C lub C++ niż w Javie. fava. Progra-
mowanie sieciowe przedstawia sposoby wykorzystywania możliwości biblioteki klas
sieciowych Javy do szybkiego i łatwego pisania programów, wykonujących wiele
typowych zadań sieciowych. Takimi zadaniami są:
Przeglądanie stron WWW. ' /'' ' ;.
Parsowanie irenderowanie HTML-a. '..,.,'"'''
Wysyłanie poczty elektronicznej za pomocą protokołu SMTP.
Odbieranie poczty elektronicznej za pomocą protokołu POP i IMAP.
Pisanie serwerów wielowątkowych.
Instalowanie w przeglądarce nowego protokołu i programu obsługi treści. '
Kodowanie komunikatów w celu zagwarantowania poufności, autentyczności
i bezpieczeństwa.
Projektowanie klientów graficznego interfejsu użytkownika (GUI) dla usług sie-
ciowych. ,
Przesyłanie danych programom CGI. ^ ,, : ;: J> ,; - r ? ?s.
Wyszukiwanie węzłów sieci za pomocą DNS-u. ; " W1; : ;i .
Ściąganie plików za pomocą anonimowego FTP.
'"ł1*
Łączenie gniazd w komunikacji sieciowej niskiego poziomu.
Rozprowadzanie aplikaq'i wśród wielu systemów za pomocą zdalnego wywo-
ływania metod (RMI).
Java jest pierwszym językiem zapewniającym tak potężną międzyplatformową bi-
bliotekę sieciową, która jest w stanie obsługiwać wszystkie te, tak różnorodne, zada-
nia. Java. Programowanie sieciowe podkreśla możliwości i wyrafinowanie tej bibliote-
ki. Ta książka ma zachęcić cię do poważnego wykorzystywania Javy w roli platfor-
my programowania sieciowego. Dlatego przedstawia ogólne tło podstaw progra-
mowania sieciowego, jak również szczegółowy opis zawartych w Javie ułatwień do
pisania programów sieciowych. Nauczysz się z niej pisania apletów i aplikacji Javy,
które w Internecie dzielą się danymi potrzebnymi w grach, przy współpracy, do
uaktualniania oprogramowania, przesyłania plików i innych zastosowań. Poznasz
także od podszewki protokoły HTTP, CGI, TCP/IP oraz inne, na których opiera się
Internet i sieć WWW. Po przeczytaniu tej książki będziesz posiadał wiedzę i narzę-
dzia potrzebne do tworzenia oprogramowania nowej generacji, w pełni wykorzy-
stującego możliwości oferowane przez Internet. ..-, ;.-
Uwagi do wydania drugiego*
W rozdziale otwierającym pierwsze* wydanie tej książki napisałem sporo o dyna-
micznych, rozproszonych aplikacjach sieciowych, których zaistnienie, jak myślałem,
będzie możliwe dzięki Javie. Jednym z najbardziej ekscytujących aspektów pisania
wydania drugiego była możliwość naocznego przekonania się, że pojawiły się prak-
tycznie wszystkie prognozowane przeze mnie rodzaje aplikacji. Programiści uży-
wają Javy do wysyłania zapytań serwerom baz danych, nadzorowania stron WWW,
sterowania teleskopami, zarządzania grami przeznaczonymi dla wielu użytkowni-
ków i do innych zastosowań, a wszystko to dzięki wykorzystaniu zdolności Javy do
uzyskiwania dostępu do Internetu. Należy zaznaczyć, że Java wyszła znacznie poza
stadium eksperymentalne, w szczególności programowanie sieciowe w Javic wesz-
ło w dziedzinę aplikacji wykonujących prawdziwe zadania. Na razie jeszcze nie całe
oprogramowanie sieciowe zostało napisane'w Javie, lecz bynajmniej nie z powodu
braku takich prób. Trwają starania, aby istniejącą infrastrukturę klientów i serwe-
rów sieci napisaną w języku C zastąpić odpowiednikiem w samej Javie. Jest mało
prawdopodobne, że w najbliższej przyszłości Java zastąpi język C w całym progra-
mowaniu sieciowym. Jednak sam fakt, że wiele osób chętnie używa przeglądarek
sieciowych, serwerów sieciowych i innych programów napisanych w Javie, dowo-
dzi, jak wiele osiągnęliśmy od 1996 roku.
Ta książka również ma za sobą długą drogę. Wydanie drugie zostało praktycznie
napisane od podstaw. Zawiera pięć zupełnie nowych rozdziałów. Niektóre z nich
odzwierciedlają API i możliwości Javy, które pojawiły się od czasu opublikowania
wydania pierwszego (rozdział 8. "HTML w Swingu", rozdział 12. "Bezpieczne
gniazda" oraz rozdział 19. "JavaMail API"), a w pozostałych rozdziałach skorzy-
* Wydanie amerykańskie [przyp. red.].
stałem z mojego doświadczenia wykładowcy i szczególną uwagę zwróciłem na te
zagadnienia, które sprawiają studentom problem (rozdział 4. "Wejście i wyjście w
Javie" i rozdział 5. "Wątki"). Poza tym rozdział o API serwletów Javy został usunię-
ty, ponieważ ten temat zasługuje na własną książkę; taka została zresztą już napisa-
na: Jason Hunter Java Servlet Programming (O'Reilly&Associates, Inc., 1998).
Jednakże ważniejsze od usuniętych lub dodanych rozdziałów są zmiany dokonane
w tych rozdziałach, które pozostały. Najbardziej oczywistą zmianą względem wy-
dania pierwszego było przepisanie wszystkich przykładów dla API wejścia i wyjścia
w Javie 1.1. Komunikaty, które zadręczały czytelników podczas kompilowania
przykładów z pierwszego wydania w Javie 1.1 lub późniejszych, należą już do
przeszłości. Mniej oczywiste, lecz znacznie istotniejsze jest to, że zostały napisane od
nowa w celu zastosowania w nich jasnego, obiektowego modelu, zgodnego z kon-
wencjami nazewniczymi Javy i zasadami projektowania. Tak jak prawie wszyscy
(Sun nie jest wyjątkiem), podczas pisania pierwszego wydania w 1996 roku usi-
łowałem wyobrazić sobie mnóstwo szczegółów dotyczących tego, co i jak można ro-
bić w Javie. Stare przykłady miały poprawny kod sieciowy, ale teraz pod wieloma
względami wydawały mi się zawstydzająco amatorskie. Od tamtej pory sporo na-
uczyłem się na temat programowania w Javie i programowania obiektowego, więc
mam nadzieję, że w tym wydaniu nabyte doświadczenie będzie widoczne. Jako
przykład niech posłuży informacja, że nie używam już samodzielnych aplctów tam,
gdzie wystarczy zwykła aplikacja, oparta na systemie ramek. Mam nadzieję, że
nowe przykłady posłużą nie tylko jako wzorce pisania programów sieciowych, ale
wszelkiego kodu w Javie.
Oczywiście również tekst został wyszlifowany. Napisanie tego drugiego, poprawio-
nego tekstu zajęło mi w zasadzie tyle samo czasu, ile oryginału. Jak już wspo-
mniałem, jest pięć całkiem nowych rozdziałów, a czternaście poprawionych roz-
działów zostało w znacznym stopniu napisanych ponownie i poszerzonych, żeby
były na tyle aktualne co nowe opracowania, a także by stały się przejrzystsze i bar-
dziej zajmujące. Ta wersja książki, powiedzmy sobie szczerze, została napisana
znacznie lepiej niż pierwsze wydanie, nawet jeśli pominiemy wszystkie zmiany do-
konane w przykładach. Mam nadzieję, że to wydanie zostanie uznane za lepszy,
trwalszy, przydatniejszy i ciekawszy informator i podręcznik programowania sie-
ciowego w Javie niż wydanie sprzed czterech lat. v . ;
Układ książki
Książka zaczyna się trzema rozdziałami opisującymi działanie sieci i programów
sieciowych. Rozdział 1. "Dlaczego Java sieciowa?" łagodnie wprowadzi cię w pro-
gramowanie sieciowe w Javie i w aplikacje, które istnieją dzięki niej. Każdy powi-
nien tu znaleźć coś dla siebie. Opisałem tu kilka z wielu unikatowych programów,
które mogły się pojawić dopiero po zastosowaniu Javy w sieci. Rozdział 2. "Podsta-
wowe pojęcia dotyczące sieci" oraz rozdział 3. "Podstawowe pojęcia dotyczące sieci
WWW" szczegółowo wyjaśniają, czego potrzebuje programista, aby zrozumieć
działanie Internetu i sieci WWW. Rozdział 2. opisuje protokoły leżące u podstaw In-
ternetu, takie jak TCP/IP oraz UDP/IP. Rozdział 3. omawia standardy, na których
opiera się sieć WWW, takie jak HTTP, HTML oraz CGI. Jeśli napisałeś dużo prog-
ramów sieciowych w innych językach dla innych platform, możesz sobie pozwolić
na opuszczenie tych dwóch rozdziałów.
Kolejne dwa rozdziały rzucają nieco światła na dwa aspekty Javy, które mają zasad-
nicze znaczenie dla prawie wszystkich programów sieciowych, a zazwyczaj są źle
rozumiane i nieprawidłowo używane: wejście/wyjście oraz wątki. Rozdział 4. doty-
czy wyjątkowego sposobu obsługiwania w Javie wejścia i wyjścia. Zrozumienie ge-
neralnych zasad tego mechanizmu jest warunkiem wstępnym zrozumienia przy-
padku szczególnego, jakim jest w Javie obsługa sieciowego wejścia i wyjścia. Roz-
dział 5. opisuje wielowątkowość i synchronizację, ze szczególnym podkreśleniem
ich zastosowania w przypadku asynchronicznego wejścia i wyjścia oraz serwerów
sieciowych. Biegli programiści Javy mogą pobieżnie przeczytać te dwa rozdziały lub
w ogóle je pominąć. Natomiast rozdział 6. "Wyszukiwanie adresów internetowych"
ma kluczowe znaczenie dla każdego. Pokazuje on, w jaki sposób programy w Javie
oddziałują z DNS-em poprzez klasę InetAddress, jedyną klasę niezbędną prak-
tycznie we wszystkich programach sieciowych. Po przeczytaniu tego rozdziału bę-
dziesz mógł skakać po całej książce według własnych zainteresowań i potrzeb. Jed-
nakże między niektórymi rozdziałami istnieją pewne powiązania. Rysunek 1. po-
może ci wyznaczyć dopuszczalne ścieżki poruszania się po książce.
Rozdział 7. "Odnajdywanie danych za pomocą adresów URL" omawia klasę URL,
potężne narzędzie do ściągania informacji i plików z wielu rodzajów serwerów sie-
ciowych. Klasa URL umożliwia podłączenie się do serwerów sieciowych i ściągnięcie
z nich plików i dokumentów bez kłopotania cię niuansami protokołów, którymi
posługują się serwery. Dzięki tej klasie możesz połączyć się z serwerem FTP, uży-
wając tego samu kodu, za pomocą którego porozumiewałeś się z serwerem HTTP
lub odczytywałeś plik z lokalnego dysku twardego.
Gdy pobierasz z serwera jakiś plik HTML, zapewne masz zamiar coś z nim zrobić.
Parsowanie i renderowanie HTML-a jest jednym z najtrudniejszych wyzwań sto-
jących przed programistą sieciowym. Na przykład projekt Mozilla borykał się właś-
nie z tym zadaniem przez ponad dwa lata. Rozdział 8. "HTML w Swingu" wprowa-
dza niektóre mało znane klasy do parsowania i renderowania dokumentów HTML,
które zdejmują ten ciężar z twoich barków i przerzucają go na Suną.
W rozdziale 9. "Metody sieciowe klasy java.applet.Applet" zajmiemy się prześle-
dzeniem metod sieciowych jednej z pierwszych klas, którą poznają programiści
Javy, klasy Applet. Nauczysz się ściągania z serwerów sieciowych plików z obraz-
kami i plików dźwiękowych oraz śledzenia postępu ładowania. Jeśli nie używa się
nieudokumentowanych klas, jest to jedyna metoda obsługi dźwięku w Javie 1.2
i starszych wersjach.
Rozdziały od 10. do 14. opisują klasy Javy gniazd niskiego poziomu związanych
z dostępem sieciowym. W rozdziale 10. "Gniazda klientów" zostały wprowadzone
API gniazd Javy, a w szczególności klasa Socket. Rozdział ten przedstawia, jak na-
pisać klienty sieci oddziałujące z serwerami TCP wszelkiego rodzaju, w tym whois,
finger i HTTP. Rozdział 11. "Gniazda serwerów" ilustruje, jak wykorzystać klasę
ServerSocket dopisał
Rozdział 12. pokazuje, ja
cure Socket Layer - warsh
Extension - rozszerzenie J
da i datagramy UDP" dc
kół datagramów użytko
DatagramSocket prze2
cię rozdział 14. "Gniazda
UDP do komunikowania
[
E
E
E
E
Rozdział 7 Rozdział 9
.Odnajdywanie "Metody sieciowe
danych klasy
za pomocą java.apple!.Applei"
adresów URL" " """"' T
Rozdział 15 Rozdział B
Klasa "HIML w Swingu"
l IHl ('.onnHdion"
Rysunek 1. Powiązania rozdziało!
Układ książki
XV
ServerSocket do pisania w Javie serwerów dla powyższych i innych protokołów.
Rozdział 12. pokazuje, jak chronić komunikację klient-serwer, stosując SSL (ang. Se-
cure Socket Layer - warstwa bezpiecznych gniazd) oraz JSSE (ang. Java Secure Socket
Extension - rozszerzenie Javy do obsługi bezpiecznych gniazd). Rozdział 13. "Gniaz-
da i datagramy UDP" dotyczy protokołu UDP (ang. User Datagram Protocol - proto-
kół datagramów użytkownika) oraz związanych z nim klas DatagramPacket i
DatagramSocket przeznaczonych do szybkiej i niezawodnej komunikacji. Wresz-
cie rozdział 14. "Gniazda multicast" przedstawia, w jaki sposób można wykorzystać
UDP do komunikowania się jednocześnie z wieloma węzłami sieci.
Rysunek 1. Powiązania rozdziałów
XVI
Wstęp
Wszystkie pozostałe klasy, które z Javy uzyskują dostęp do sieci, opierają się na kla-
sach opisanych w tych pięciu rozdziałach.
Rozdziały od 15. do 17. dogłębniej opisują infrastrukturę wspomagającą klasę URL.
W tych rozdziałach zostały wprowadzone programy obsługi protokołu i obsługi tre-
ści oraz charakterystyczne tylko dla Javy pojęcia umożliwiające pisanie dynamicz-
nie rozszerzalnego oprogramowania, które automatycznie rozpoznaje nowe proto-
koły i rodzaje nośników. Rozdział 15. "Klasa URLConnection" opisuje klasę URL-
Connection, która spełnia rolę napędową dla klasy URL z rozdziału 7. Przedstawia
on, jak można wykorzystać zalety tej klasy poprzez jej publiczne API. Rozdział 16.
"Programy obsługi protokołu" także omawia klasę URLConnection, ale z innego
punktu widzenia. Wyjaśnia, jak zrobić z niej podklasę, aby utworzyć programy
obsługi nowych protokołów i adresów URL. Z kolei rozdział 17. "Programy obsługi
treści" dotyczy pewnego odchodzącego w zapomnienie mechanizmu Javy przezna-
czonego do obsługi nowych rodzajów nośników.
W rozdziałach 18. i 19. zostały wprowadzone dwa unikatowe API wyższego pozio-
mu dla programów sieciowych: RMI oraz JavaMail API. Rozdział 18. "Zdalne
wywoływanie metod (RMI)" przedstawia ten potężny mechanizm służący do pisa-
nia rozproszonych aplikacji Javy, które jednocześnie mogą działać na wielu róż-
norodnych systemach, komunikując się poprzez prostą metodę wywołań, czyli w
sposób właściwy programom nicrozproszonym. Rozdział 19. zapoznaje nas ze stan-
dardowymi rozszerzeniami Javy, które stanowią alternatywne rozwiązanie dla
gniazd niskopoziomowych przy komunikacji z SMTP, POP, IMAP oraz innymi ser-
werami pocztowymi. Oba te API dostarczają aplikacji rozproszonych, stanowiących
wygodniejszy odpowiednik protokołów niższego poziomu.
Kim jesteś?
Zakładam, że czytelnik tej książki zna podstawy języka Ja va i środowiska programi-
stycznego oraz ogólne zasady programowania obiektowego. W moim zamyśle ta
książka nie ma być szczegółowym podręcznikiem Javy. Powinieneś już dokładnie
znać składnię tego języka oraz umieć pisać proste aplikacje i aplety. Dobrze byłoby,
gdybyś czuł się pewnie w AWT. Gdy natrafisz na zagadnienie, które wymaga głęb-
szej znajomości programowania sieciowego - na przykład wątki i strumienie - wte-
dy oczywiście zostanie ono wyjaśnione, przynajmniej pokrótce, i
Powinieneś także być biegłym użytkownikiem Internetu. Zakładam, iż potrafisz od-
wiedzać witryny WWW oraz przesyłać pliki przez f t p. Powinieneś wiedzieć, czym
jest URL i jak go zlokalizować. Spodziewam się, że umiesz napisać prosty dokument
HTML i jesteś w stanie opublikować stronę tytułową zawierającą aplety Javy, a więc
musisz być doskonałym projektantem stron WWW.
Natomiast nie oczekuję, że masz już jakieś doświadczenie w programowaniu siecio-
wym. Ta książka ma stanowić kompletny podręcznik zagadnień sieciowych i pro-
jektowania aplikacji sieciowych. Nie spodziewam się, że w małym palcu masz kilka
tysięcy skrótów dotyczących sieci (TCP, UDP, SMTP... ). Znajdziesz tu wszystkie,
które będą ci potrzebne. W zasadzie możliwe jest, abyś potraktował tę książkę jako
Wersje Javy
XVII
ogólne wprowadzenie do programowania sieciowego z pewnego rodzaju interfej-
sem gniazdowym, a następnie zajął się nauką WSA (ang. Windows Socket Architecture
- architektura gniazd dla systemu Windows) i wyobraził sobie, jak pisać aplikacje
sieciowe w języku C++. Ale nie wiem, dlaczego miałbyś to robić - przecież dzięki
Javie pisanie bardzo skomplikowanych aplikacji staje się łatwe.
Wersje Javy ^
Od wersji l .0 Javy jej klasy sieciowe zmieniają się znacznie wolniej niż inne części
kluczowego API. Można byłoby powiedzieć, że w porównaniu z AWT lub klasami
wejścia i wyjścia prawie się nie zmieniły i wzbogaciły się tylko o kilka dodatków.
Oczywiście wszystkie programy sieciowe w szerokim zakresie korzystają z klas wej-
ścia i wyjścia oraz intensywnie używają interfejsów graficznych użytkownika (GUI).
Pisząc tę książkę, przyjąłem założenie, że ty i twoi klienci stosujecie co najmniej Javę
1.1 (stanie się ono całkiem uzasadnione w roku 2001). Zwykle używam Javy 1.1
z funkcjami takimi jak reader i writer oraz nowego modelu obsługi zdarzeń bez dal-
szych wyjaśnień.
Java 2 idzie nieco dalej. Prawie całą tę książkę napisałem w Javie 2, gdyż w syste-
mach Windows i Solaris jest ona dostępna już od ponad roku; nie ma jeszcze jednak
środowiska programistycznego ani wykonawczego dla Macintoshy. Chociaż Java 2
stopniowo wkracza na większość platform uniksowych, w tym na Linuksa, jest pra-
wie pewne, że ani Apple, ani Sun nie będą przenosić żadnej z wersji Javy 2 na system
MacOS 9.x ani wcześniejsze, co praktycznie dla 100% obecnie zainstalowanych Ma-
cintoshy oznacza brak możliwości dalszego rozwoju. (Prawdopodobnie pojawi się
Java 2 dla systemu MacOS X w 2001 roku.). Dla języka nie jest wcale dobre to, że wy-
maga "pisania raz, uruchamiania gdziekolwiek". Co więcej wirtualna maszyna Javy
firmy Microsoft obsługuje tylko Javę 1.1 i nie zanosi się na to, aby pod tym względem
coś uległo poprawie w najbliższej przyszłości (być może nic dopuszczą do tego roz-
strzygnięcia różnych sporów prawnych). Poza tym prawie wszystkie zainstalowane
obecnie przeglądarki, w tym Internet Explorer 5.5 i jej wcześniejsze wersje oraz
Netscape Navigator 4.7 i jej wcześniejsze wersje, obsługują tylko Javę 1.1. Także au-
torzy apletów w zasadzie są ograniczeni do Javy 1.1 z powodu możliwości swoich
klientów. Dlatego wygląda na to, że przynajmniej w najbliższym czasie Java 2 ogra-
niczy się do pojedynczych aplikacji w systemach Windows i Unix. Nic rezygno-
wałem z korzystania z funkcji typowych dla Javy 2 tam, gd/,ie było to naprawdę
przydatne lub właściwe - na przykład przy kodowaniu ASCII dla inputStre-
amReader oraz w programie keytool- ale wyraźnie to zaznaczyłem. Odnotowałem
przypadki, w których istnieją dla tych funkcji bezpieczne odpowiedniki w Javie l .1.
Jeśli jakaś metoda lub klasa pojawiła się dopiero od Javy l .2 lub jej nowszych wersji,
zostało to zaznaczone za pomocą komentarza umieszczonego po jej deklaracji. Oto
przykład:
public void setTimeToLive (int ttl) throws IOException // Java 1.2
Aby jeszcze bardziej zamącić, powiem, iż istnieje wiele wersji Javy 2. W chwili, w której
została ukończona ta książka, obowiązywała Java 2 SDK, Standard lidition,
XVIII
Wstęp
J i - -
i"T
vi.2.2. Przynajmniej tak była nazywana. Zdaje się, że Sun zmienia nazwy pod
wpływem rad konsultantów od marketingu. W poprzednim wcieleniu była ona zna-
na po prostu jako JDK. Sun udostępnił także J2EE (ang. ]ava 2 Platform, Enterprise
Edition) oraz J2ME (ang. }ava 2 Platform, Micro Edition). J2EE jest zestawem funk-
cji edycji standardowej poszerzonym o funkcje, takie jak interfejs nazw i katalogów
Javy (ang. ]ava Naming and Directory Interface) oraz JavaMail API, które zapewnia
API wysokopoziomowe dla aplikacji rozproszonych. Niektóre z tych dodatkowych
API są także dostępne w postaci rozszerzeń do edycji standardowej Javy i w taki
sposób będą tu traktowane. J2ME jest podzestawem edycji standardowej ukierunko-
wanym na telefony komórkowe, dekodery satelitarne i inne pamięci, procesory oraz
urządzenia do prezentacji grafiki. Usunięto z niej API graficznego interfejsu użyt-
kownika, które programiści tradycyjnie wiązali z Javą, a nieoczekiwanie pozo-
stawiono prawie wszystkie podstawowe klasy sieciowe oraz klasy wejścia i wyjścia,
które zostały omówione w tej książce. Poza tym, kiedy książka była napisana w
połowie, Sun wypuścił wersję beta Javy 2 SDK, Standard Edition, vi .3. Ma ona kil-
ka dodanych elementów sieciowego API, a większość istniejącego API została nie-
tknięta. W ciągu następnych kilku miesięcy Sun opublikował kolejne wersje beta
JDK 1.3. Ostateczne poprawki zostały uwzględnione w tej książce, a cały kod został
przetestowany z końcową wersją JDK 1.3.
Prawdę mówiąc, problem z tymi wszystkimi wersjami i edycjami nie polegał na pi-
saniu od nowa fragmentów, które o nich traktowały. Najtrudniej było określić, jak
należy je identyfikować w tekście. Po prostu nie zgadzam się na pisanie Java 2
SDK, Standard Edition, vi .3 ani nawet Java 2 1.3 za każdym razem, gdy chcę zazna-
czyć nową funkcję z ostatniego wydania Javy. Dlatego więc przyjąłem następującą
konwencję:
Java l .0 oznacza wszystkie wersje Javy, które mniej więcej mają zaimplementowa-
nc API Javy, zdefiniowane w Java Dcvelopment Kit 1.0.2 firmy Sun.
java 1.1 oznacza wszystkie wersje Javy, które mniej więcej mają znimplemcnto-
wane API Javy, zdefiniowane w dowolnej wersji Java Development Kit l .1 .x firmy
Sun. Ta definicja obejmuje produkty innych firm, takie jak MJR (ang. Macintosli
Runtime for Java) 2.0, 2.1 oraz 2.2.
Java l .2 oznacza wszystkie wersje Javy, które mniej więcej mają zaimplemento-
wane API Javy, zdefiniowane w edycji standardowej Java Development Kit l .2.x
firmy Sun. Nic zaliczają się tu uzupełnienia J2EE, które będą traktowane jako roz-
szerzenia standardu. Zazwyczaj należą one do pakietu j,wax, a nie pakietów
java.
Java 1.3 oznacza wszystkie wersje Javy, które mniej więcej mają zaimplemento-
wane API Javy, zdefiniowane w edycji standardowej Java Development Kit l .3 fir-
my Sun.
Krótko mówiąc, ta książka opisuje istniejący stan rzeczy dla programowania siecio-
wego w Javic 2, które tak naprawdę niezbyt różni się od programowania sieciowego
w Javic 1.1. Uaktualnienia i poprawki zamieszczę w mojej witrynie pod adresem
Uwagi na temat przykładów
XIX
http://metalab.unc.edu/javafaci/books/jnp2e/, gdy zostaną udostępnione dalsze informa-
cje. Jednakże sieciowe API wydają się dość niezmienne. ;
Bezpieczeństwo " 4 ;
Nie wiem, czy można wskazać najczęściej zadawane pytanie na temat pierwszego
wydania książki Java, Programowanie sieciowe, ale na pewno istniała najczęściej udzie-
lana odpowiedź, która odnosi się również do tej edycji. Mój błąd w pierwszym wy-
daniu polegał na ukryciu tej odpowiedzi w końcowej części rozdziału, którego więk-
szość nie czytała. A ponieważ w zasadzie to samo stwierdzenie powinno stanowić
odpowiedź na podobną liczbę pytań od czytelników tej książki, to chcę ją podać na
samym początku (a potem wielokrotnie powtarzać w całej książce ze względu na
czytelników, którzy zazwyczaj pomijają wstępy): Zabezpieczenia ]avy nie dopuszczają,
aby prawie wszystkie przykłady i metody omawiane w tej książce działały w aplecie.
Ta książka dotyczy przede wszystkim aplikacji. Niepewnym apletom Javy wolno
komunikować się poprzez Internet tylko z tym węzłem sieci, z którego pochodzą.
Dotyczy to również węzła, na którym działają. Problem nie zawsze jest oczywisty -
nie wszystkie przeglądarki sieciowe prawidłowo informują o wyjątkach w systemie
zabezpieczeń - a mimo to istnieje. W Javie l .2 i jej późniejszych wersjach istnieją spo-
soby poluzowania ograniczeń dla apletów, tak że uzyskują one nieco swobodniejszy
dostęp do sieci. Jednak są to wyjątki, a nie reguła. Jeśli uruchamiając samodzielną
aplikację, spowodujesz uruchomienie apletu i nie będziesz mógł nakłonić aplikacji
do pracy wewnątrz przeglądarki WWW, to prawie pewne jest, że problem polega na
konflikcie z menedżerem zabezpieczeń przeglądarki.
Uwagi na temat przykładów
Większość metod i klas opisanych w tej książce została zilustrowana co najmniej jed-
nym kompletnym i działającym programem, choćby nawet prostym. Z mojego do-
świadczenia wynika, że kompletny, działający program jest niezbędny do zaprezen-
towania właściwego wykorzystania metody. Bez takiego programu zbyt łatwo popa-
da się w żargon lub samemu dopowiada się tam, gdzie sam autor nie do końca zrozu-
miał zagadnienie. Często nawet w dokumentacji API Javy opisy wywołań metod są
zbyt lakoniczne. W tej książce wolałem zgrzeszyć nadmiarem wyjaśnień ni/, ich nie-
dostatkiem. Jeśli jakaś kwestia jest dla ciebie oczywista, po prostu ją pomiń. Nie mu-
sisz wpisywać i uruchamiać każdego przykładu z tej książki, ale jeśli któraś metoda
sprawia ci kłopoty, to wiedz, że znajdziesz tu przynajmniej jeden działający przykład.
Każdy rozdział zawiera co najmniej jeden bardziej złożony program (a często kilka ta-
kich programów), który ilustruje stosowanie klas i metod z tego rozdziału przy bar-
dziej realistycznych ustawieniach. Często opiera się to na funkcjach Javy, które nie zo-
stały opisane w tej książce. Co prawda w wielu programach składniki sieciowe są je-
dynie niewielką częścią kodu źródłowego i to najłatwiejszą, niemniej jednak żaden z
tych programów nie mógłby zostać napisany równie łatwo w językach, które pracy w
sieci nic zapewniają tej centralnej pozycji, jaką daje jej Java. Dająca się zauważyć pro-
XX
Wstęp
J
f[.-- L...\
stota sekcji sieciowych kodu odzwierciedla kluczową pozycję pracy w sieci wśród
funkq'i Javy, natomiast nie stanowi o jakiejkolwiek trywialności samego programu.
Wszystkie zaprezentowane tu przykładowe programy są dostępne w postaci elektro-
nicznej, często też z poprawkami i rozszerzeniami. Możesz ściągnąć kod źródłowy
z http://metalab.unc.edu/javafaq/books/jnp2e oraz http://www.oreUly.com/catalog/javanp2/.
W tej książce założyłem, że posługujesz się JDK firmy Sun. Wszystkie przykłady
przetestowałem w systemie Windows, a znaczną część także w systemie Solaris i na
Macintoshach. Prawie wszystkie podane tu przykłady powinny działać na innych
platformach oraz z innymi kompilatorami i wirtualnymi maszynami obsługującymi
Javę 1.2 (a wiele w Javie 1.1). Nieliczne przykłady, które wymagają Javy 1.3, zostały
wyraźnie oznaczone. W rzeczywistości każda implementacja Javy, którą testo-
wałem, miała niebagatelne błędy w części dotyczącej sieci, więc nie jest możliwe za-
gwarantowanie pełnej wydajności. Starałem się zaznaczyć wszystkie te miejsca,
w których metoda zachowuje się inaczej niż przewidywała to firma Sun.
Konwencje zastosowane w tej książce
Tekst książki został napisany normalną czcionką Times Roman. v
Czcionką Courier zostały napisane: ' 'i v
przykładowy kod (także jeśli prezentowane są jego fragmenty);
słowa kluczowe, operatory, typy danych, nazwy zmiennych, nazwy klas i nazwy
interfejsów, które mogą pojawić się w programie Javy; ,?,,,; - :
wyjście programu; ,; 'r ;
znaczniki, które mogą pojawić się w dokumencie HTML.
Pogrubioną czcionką Courier zostały napisane: '''r".?.'. , V
wiersze poleceń i opcje, które należy wpisać dosłownie.
Pochyloną czcionką Courier zostały napisane: ;
fragmenty kodu, które mogą zostać zastąpione lub zmienione. ' ' '
Pochyloną czcionką Times Roman zostały napisane:
nowe terminy w miejscu, w którym są one definiowane;
nazwy ścieżek, nazwy plików i nazwy programów (jeśli jednak nazwa programu
jest również nazwą klasy w ]avic, to została napisana tą samą czcionką co po/,o-
stałc nazwy klas);
nazwy węzłów sieci i domen (java.orcilly.com); < i..
adresy URL (http://metalab.unc.edu/javafaq/); " ; y ;, , ..
tytuły innych książek (Java Serulet Programming).
Ważne fragmenty kodu i całe programy na ogół zostały umieszczone w oddzielnym
akapicie, jak poniżej: t ;.. .-,-, ,;,r- . : .>(
Socket s- new Socket ("java. oreilly. com", 80); -; . ...-
ii: ( ! s.getTcpNoDelay () ) s . setTcpNoDo l ay (t t m*) ; ,. . ,
Konwencje zastosowane w tej książce
XXI
Jeśli kod został przedstawiony w postaci fragmentów, a nie w całości, to istnienia od-
powiednich instrukcji import należy się domyślić. Na przykład w poprzednim
fragmencie kodu możesz założyć, że j ava. net. Socket zostało zaimportowane.
W niektórych przykładach wejście wprowadzane przez użytkownika przeplata się
z wyjściem programu. Wtedy wejście użytkownika wyróżnione jest pogrubieniem,
jak w tym przykładzie pochodzącym z rozdziału 10.:
% telnet localhost 7 , , . ,,
Trying 127.0.0.1. .. ' " ": ''-"':: ^ ';*'-"f-;".#
Connected to localhost. ..' "" /
Escape character is IA] '. -...
To jest test. . ' . * ; *, .
To jest test. ' "i-. '...'' ".' '':'-;" ':"' '-.' . "'.''.?:.
To jest kolejny test. '.:.'' . . ., ,, '.'.-'-.'' .-'-'. .: '!
To jest kolejny test. _ ',-.:',-. . . -, . . .
9876543210 ' ," . "''.'.' V' " ','
9876543210 ' ..,-.,;..; ... : ,-: .: .-, ..v.-, , - ; i-
*] '. . '. -/' r-" -. - -.<-; ;--0;. ^v -.,.,.:-..^
telnet> close . ' ' , ...'.....- : r':-a- *.-. -, > - -'-t
Connection closed. '- '
,-; ; , t ,.,. -,,, .-.- .-...
W Javie wielkość liter ma znaczenie. Java. net. socket nie jest tym samym co
java. net. socket. Języki programowania o takiej właściwości nie zawsze pozwa-
lają autorom na stosowanie reguł standardowej angielskiej gramatyki. Na ogół mo-
żliwe jest zredagowanie zdania w taki sposób, aby nie dochodziło do konfliktu, więc
tam, gdzie się dało, starałem się tak konstruować zdania. Zgodnie z tą zasadą, gdy
w tekście chciałem odwołać się do klasy lub przykładu klasy, używałem wielkiej li-
tery, co można zobaczyć w kodzie źródłowym, zazwyczaj na początku i w środku -
na przykład ServerSocket.
W całej książce, zgodnie z brytyjskimi regułami stosowania znaków przestanko-
wych, umieszczałem znak zapytania wewnątrz tylko wtedy, gdy stanowił on część
cytowanego materiału. Mimo że w szkole uczyłem się reguł amerykańskich, system
brytyjski wydaje mi się logiczniejszy, zazwyczaj nawet wtedy, gdy trzeba umieścić
kod źródłowy w cudzysłowie, a brakujący lub nadmiarowy przecinek, średnik lub
kropka decydują, czy kod da się skompilować, czy nie.
Chociaż zamieszczone tu przykłady mają charakter akademicki, a nie praktyczny, to
kilka z opracowanych przeze mnie klas ma prawdziwą wartość. Swobodnie możesz
je (lub dowolne ich części) wykorzystać w swoim kodzie. Nic potrzebujesz do tego
żadnych specjalnych zezwoleń. Jeśli chodzi o mój kod, to jest on własnością pu-
bliczną (nic dotyczy to jednak opisującego go tekstu!). Takie klasy znajdują się
gdzieś w pakiecie com.macf aq, który w zasadzie odzwierciedla strukturę pakietu
java. Na przykład klasa Saf ePrinterWri ter z rozdziału 4. znajduje się w pakie-
cie com. mac f aq. i o. Kiedy pracujesz na tych klasach, nie zapominaj, że skompilo-
wane pliki .class muszą znajdować się w katalogach odpowiadających strukturze ich
pakietów wewnątrz ścieżki klasy oraz że musisz je zaimportować do swojej klasy,
zanim zaczniesz z nich korzystać. Na stronic WWW tej książki, pod adresem
http://metalabMnc.edu/javafacj/books/jnp2c/ znajdziesz plik-pojemnik, zawierający
wszystkie te klasy, które mogą zostać zainstalowane na twojej ścieżce klasy.
XXII
Wstęp
,--11
..___j___
Prośba o komentarze
Bardzo mnie cieszy, gdy dostaję od czytelników ogólne uwagi, jaka dobra mogłaby
być ta książka, konkretne poprawki, tematy zagadnień, które chcieliby zobaczyć
opisane, lub po prostu historie ich zmagań w pracy nad programowaniem siecio-
wym. Możesz skontaktować się ze mną za pomocą poczty elektronicznej dharo@me-
talab.unc.edu. Proszę, weź jednak pod uwagę, że codziennie dostaję setki listów i dla-
tego nie mogę osobiście odpowiedzieć na każdy z nich. Aby mieć większe szansę na
uzyskanie mojej osobistej odpowiedzi, zaznacz, że jesteś czytelnikiem tej książki. Je-
śli twoje pytanie dotyczy konkretnego programu, który nie działa tak, jak się tego
spodziewałeś, spróbuj sprowadzić zagadnienie do najprostszego przypadku, który
wywołuje błąd, najlepiej do jednej klasy, a następnie wstaw tekst całego programu
do swojego listu. Nieprzemyślana korespondencja będzie kasowana bez otwierania.
I bardzo proszę, abyś wysyłał wiadomość z tego konta, na które chcesz otrzymać od-
powiedź, oraz upewnił się, że masz właściwie ustawiony adres zwrotny! Nie ma nic
bardziej frustrującego niż spędzenie godziny lub więcej na sumiennym przygotowa-
niu odpowiedzi na interesujące pytanie tylko po to, aby trafić w próżnię, gdyż kore-
spondent kontaktował się ze mną z publicznego terminala i zapomniał w ustawie-
niach przeglądarki wstawić swój aktualny adres poczty elektronicznej.
Należę także do zwolenników starego powiedzenia: "Jeśli książka ci się podobała,
powiedz o niej znajomym. Jeśli nie, powiedz to mnie" . Chciałbym usłyszeć zwłasz-
cza o pomyłkach. Jest to moja ósma książka. Nie opublikowałem jeszcze idealnej, ale
wciąż się staram. I chociaż redaktorzy wydawnictwa O'Reilly i ja ciężko pracowaliś-
my nad tą książką, to jestem pewien, że gdzieś przepuściliśmy omyłki i błędy typo-
graficzne. Poza tym jestem przekonany, że przynajmniej jeden z nich jest strasznie
kłopotliwym kłamstwem. Jeśli znajdziesz jakiś błąd lub literówkę, proszę daj mi
znać, abym mógł to poprawić. Zamieszczę to na stronie WWW tej książki pod
adresem http://metalab.unc.edu/javafaq/books/inp2c/ oraz w witrynie wydawnictwa
O'Reilly pod adresem http://www.oreilly.com/catalog/javanp2/errata/. Zanim zgłosisz
błąd, sprawdź proszę na jednej z tych stron, czy przypadkiem nie zostałem już o nim
poinformowany i czy nie zamieściłem tam korekty. Wszystkie zgłoszone błędy zo-
staną skorygowane w następnych wydaniach książki.
Informacje o znalezionych błędach, jak również sugestie co do kolejnych wydań,
możesz także przesłać na adres:
O'Reilly & Associates, Inc. . '
101 Morris Street "'''' ' J;r< '" '" " vv'" -
Sebastopol, CA 95472 """'""' - ' : -
(800) 998-9938 (w USA lub Kanadzie) ' , ?" '
" (707) 829-0515 (międzynarodowy/lokalny) * " <
! (707) 829-0104 (f ax) . -"t;"--i>:- '
Prośba o komentarze
XXIII
Możesz także wysłać korespondencję elektroniczną prosto do wydawnictwa O'Reilly.
Aby znaleźć się na liście adresowej lub poprosić o katalog, wyślij wiadomość elek-
troniczną do:
info@oreilly.com
Pytania techniczne oraz komentarze na temat książki wyślij elektronicznie na adres:
bookcjuestions@oreilly.com ? r > .,,-<<'.;....^ji* l{::~nn.iify^
Więcej informacji o tej książce oraz innych pozycjach znajdziesz w witrynie siecio-
wej wydawnictwa O'Reilly:
http://www.oreilly.com "" ' ' '"'"' "'"" ''-'"'K' ''*
Pozwól, że wyjaśnię parę kwestii, które często niesłusznie są zgłaszane do popra-
wienia. Po pierwsze, nie wszystkie sygnatury metod podane w tej książce dokładnie
odpowiadają sygnaturom z dokumentacji API javadoc firmy Sun. W szczególności,
często zmieniam nazwy argumentów, aby było jasne, co oznaczają. Na przykład Sun
określa w dokumentacji metodę parse() w klasie HTMLEditorKit. Parser
w następujący sposób:
public abstract void parse (Reader r, HTMLEditorKit. ParserCallback cb, L-
boolean ignoreCharSet) throws IOException
Napisałem to w bardziej zrozumiały sposób: ,,,, . , , f , . ,.,.,,.
public abstract void parse(Reader input, HTMLEditorKit.ParserCallback '
callback, boolean ignoreCharSet) throws IOException :
Oba zapisy oznaczają dokładnie to samo. Nazwy argumentów metod są czysto for-
malne i nie mają żadnego wpływu na kod klienta pisany przez programistów, który
wywołuje te metody. Równie dobrze mogłem napisać to po łacinie lub w języku
mieszkańców wysp Fidżi, co tak naprawdę niczego by nie zmieniło. Jedyną różnicę
stanowi zrozumiałość dla czytelnika.
Poza tym, czasami dodawałem do niektórych metod warunki t hrows, które są le-
galne, ale nieobowiązkowe. Na przykład, jeśli metoda jest zadeklarowana jako wy-
rzucająca tylko wyjątki lOException, ale akurat może wyrzucić ConnectExcep-
tion, UnknownHostException oraz SSLException i wszystkie podklasy
IOException, to czasami deklaruję wszystkie cztery możliwe wyjątki. Co więcej,
jeżeli wygląda na to, że w określonych okolicznościach metoda wyrzuca konkretny
wyjątek systemu runtime, taki jak NullPointerExcept i on, Sccuri LyF,xcop-
tion lub 11 Legał Ar (jurnent.F,xception, to również odnotowuję ten fakt w sy-
gnaturze metody. Oto na przykład deklaracja firmy Sun jednego /. konstruktorów
Socket:
public Socket (InetAddress address, int port) throws IOException .. :,,
A oto moja dla tego samego konstruktora:
public Socket(InetAddress address, int port)
throws ConnectException, IOException, SecurityException
Nie sq one zupełnie równoważne - moja jest pełniejsza - ale nn ich podstawie po-
wstanie dokładnie taki sam skompilowany kod bajtowy.
H
1-TT
xx/i/
-i
..4-
J.
Podziękowania
W powstanie tej książki było zaangażowanych wiele osób. Mój redaktor, Mikę Louki-
des, nadał całej sprawie bieg i udzielał mi wielu pomocnych komentarzy w trakcie
udoskonalania przeze mnie książki. Dr Peter "Peppar" Parnes niezmiernie mi pomógł
przy rozdziałach dotyczących przesyłania grupowego. Korektorzy i redaktorzy
techniczni zapewnili nieocenioną pomoc w wyłapywaniu błędów i opustek. Dzięki
bezcennym radom Simona St. Laurenta wiedziałem, które tematy wymagają rozwi-
nięcia. Scott Oaks, użyczając swojej wiedzy o wątkach w rozdziale 5., gdzie odnalazł
ledwo uchwytne błędy, udowodnił, że zagadnienie wielowątkowości wciąż wyma-
ga spojrzenia eksperta. Jim Farley zgłosił wiele przydatnych uwag dotyczących RMI
(rozdział 18.). Nieustające zaangażowanie Timothy F. Rohaly'ego pozwoliło upew-
nić się, że zamknąłem wszystkie gniazda i wyłapałem wszelkie istniejące wyjątki
oraz że napisany kod jest możliwie jasny, bezpieczny i najbardziej odpowiedni. John
Zukowski znalazł liczne opustki, które dzięki niemu zostały uzupełnione. A sokole
oko Avnera Gelba wykazało się zadziwiającą umiejętnością wypatrywania
pomyłek, które w jakiś sposób umknęły mojej uwadze, wszystkim korektorom oraz
dziesiątkom tysięcy czytelników pierwszego wydania książki.
Nie jest przyjęte dziękowanie wydawcy, ale to właśnie on nadaje ton całemu
wydawnictwu, autorom, redaktorom, a także personelowi technicznemu. Myślę, że
Tim O'Rcilly zasługuje na specjalne wyrazy uznania za uczynienie O'Reilly & Asso-
ciates, Inc. jednym z najlepszych wydawnictw, dla których można pisać. Jeżeli ist-
nieje taka osoba, bez której ta książka nigdy by nie powstała, to jest nią właśnie Tim.
I jeśli, drogi czytelniku, uznasz, że książki wydawnictwa O'Reilly są istotnie lepsze
od większości znajdujących się na rynku, to jest to jego bezpośrednią zasługą.
Mój agent, David Rogelberg, przekonał mnie, iż możliwe jest zarabianie na życie pi-
saniem książek takich jak ta, zamiast pracowania w jakimś biur/.e. Cały zespół w mc-
talab.unc.edu przez ostatnie kilka lat naprawdę ulepszył sposoby komunikowania się
z czytelnikami. Każdy czytelnik, który przesłał mi pochwały czy nagany za pierw-
sze wydanie książki, przyczynił się do napisania tej poprawionej wersji. Wszystkim
tym osobom należą się podziękowania i wyrazy uznania. I wreszcie jak zawsze
chciałbym złożyć serdeczne podziękowania mojej żonie, Beth. Bez jej miłości
i wsparcia ta książka nigdy by nie zaistniała. ....*-,<.< : ;..<;.-, s ? v '.'>:r-- .; :-
EllioHc Rusly Uamld
dharo@mctalab.unc.cdu
20 kwietnia 2000 r.
1
Dlaczego Java sieciowa?
W tym rozdziale:
Co potrafi program sieciowy?
Chwileczkę! Jeszcze coś!
Java jest pierwszym jeżykiem programowania od razu zaprojektowanym z myślą
o sieci. Globalny Internet rozrasta się, a Java wyjątkowo dobrze nadaje się do budo-
wania aplikacji sieciowych następnej generacji. Oferuje ona rozwiązania licznych
problemów - najważniejsze to niezależność platformowa, bezpieczeństwo i między-
narodowy zestaw znaków - które decydują o znaczeniu aplikacji internetowych,
a wciąż jeszcze są trudne do wyegzekwowania w innych językach. Te i inne cechy
Javy umożliwiają internautom szybkie ściąganie z witryn sieciowych programów
nieuwiarygodnionych i wykonywanie ich bez obaw, że rozprzestrzenia one wirusa,
ukradną dane lub spowodują załamanie systemu. Faktem jest, że aplct |a vy ma wbu-
dowane znacznie większe zabezpieczenia niż oprogramowanie z półki sklepowej.
Jedną z największych tajemnic Javy jest sposób na łatwe pisanie programów siecio-
wych. Rzeczywiście, znacznie łatwiej jest napisać program sieciowy w Javie niż
praktycznie w jakimkolwiek innym języku. Ta książka przedstawia dziesiątki kom-
pletnych programów wykorzystujących Internet. Niektóre z nich są prostymi,
podręcznikowymi przykładami, a inne w pełni funkcjonalnymi aplikacjami. Z pew-
nością zauważysz w tych aplikacjach, jak niewiele kodu przeznaczono na obsługę
działania w sieci. Nawet w programach intensywnie eksploatujących siec, takich jak
serwery i klienty WWW, prawic cały kod zajmuje się przetwarzaniem danych lub
obsługą interfejsu użytkownika. Ta część programu, która współdziała z siecią, jest
zazwyczaj najkrótsza i najprostsza.
Jednym słowem, dla aplikacji Javy wysyłanie danych poprzez Internet i odbieranie
ich stamtąd jest łatwe. Także aplety mogą komunikować się za pośrednictwem Inter-
netu, ale ograniczają te zabezpieczenia. W tym rozdziale dowiesz się nieco, jak w
Javie pisze się aplety i aplikacje ukierunkowane na działanie sieciowe. W dalszych
rozdziałach poznasz narzędzia potrzebne do tworzenia takich programów.
Co potrafi program sieciowy?
ed Astronomy - stratosferyczne obserwatorium astronomiczne w zakresie pod-
czerwieni).*
Program napisany w Javie może zrobić to wszystko, a nawet jeszcze więcej. Potrafi
wysłać do bazy danych zapytania SQL. Rysunek 1-1 przedstawia fragment progra-
mu, który komunikuje się ze zdalnym serwerem bazy danych, aby przekazać zapy-
tania bazie danych Books in Print.
Bowker Books in Print <199Sto Februaiy 1999>
(^ Display Oocumenis
(JfSnu "-' &nsl
D ?
Amjhor Help
Sy
Maory
. Run Sftyed
iii Stth
Setrttt Htaory : set 4: OT?eillypb
Otattorc [T* -J.-.
51 9 document(s)
Select