[ Pobierz całość w formacie PDF ]
.log("Problem accepting client's socket connection: " +ioe.getClass().getName() + ": " + ioe.getMessage());}}}catch (ThreadDeath e) {// Kiedy w¹tek zostaje zabity, zamkniêcie portu serweratry {serverSocket.close();}catch (IOException ioe) {servlet.log("Problem closing server socket: " +ioe.getClass().getName() + ": " + ioe.getMessage());}}}}Metoda init() DaemonHttpServlet tworzy i rozpoczyna nowy w¹tek Daemon, któryodpowiada za nas³uchiwanie po³¹czeñ przychodz¹cych.Metoda destroy() zatrzymujew¹tek.Sprawia to ¿e imperatywem staje siê, ¿eby ka¿dy serwlet bêd¹cy podklas¹DaemonHttpServlet wywo³ywa³ super.init() i super.destroy(), je¿eli serwlet tenwykorzystuje w³asne metody init() i destroy().(Serwlet napisany wed³ug ServletAPI 2.1 i wykorzystuj¹cy bez argumentów init() nie musi wywo³ywaæ super.init(),lecz musi wywo³aæ super.destroy().)W¹tek Daemon rozpoczyna dzia³alnoœæ utworzeniem ServerSocket w celunas³uchiwania na konkretnym porcie po³¹czenia.Numer portu jest okreœlany przezwywo³anie metody serwletu getSocketPort().Wartoœæ przez ni¹ zwracana towartoœæ parametru inicjacji SocketPort, lub, w wypadku nieistnienia tegoparametru, obecna wartoœæ zmiennej DEFAULT_PORT.Serwlet mo¿e zdecydowaæ siê naprzejêcie implementacji getSocketPort, je¿eli jest to konieczne.Po utworzeniu ServerSocket, w¹tek Daemon czeka na nadchodz¹ce ¿¹dania przypomocy wywo³ania serverSocket.accept().Metoda jest blokuj¹ca — zatrzymujewykonywanie tego w¹tku do czasu po³¹czenia siê przez klienta.Kiedy siê todzieje, metoda accept() zwraca obiekt Socket, który w¹tek Daemon natychmiastprzekazuje do metody serwletu handleClient().Ta metoda zazwyczaj tworzy w¹tekobs³uguj¹cy i natychmiast powraca, powoduj¹c przejœcie w¹tku Daemon w stangotowoœci do przyjêcia nastêpnego po³¹czenia.Oczyszczenie portu jest tak samo wa¿ne, jak jego konfiguracja.Nale¿y upewniæsiê, ¿e port po³¹czenia dzia³a tak d³ugo jak serwlet, ale nie d³u¿ej.W tymmomencie metoda destroy() DaemonHttpServlet wywo³uje metodê stop() w¹tkuDaemon.Wywo³anie to nie zatrzymuje jednak natychmiast w¹tku Daemon.Powodujejedynie wyst¹pienie wyj¹tku ThreadDeath w¹tku Daemon w jego aktualnym miejscuwykonania.W¹tek Daemon przejmuje ten wyj¹tek i zamyka port po³¹czenia.Przy stworzeniu serwletu dzia³aj¹cego jako serwer nie-HTTP mog¹ wyst¹piæ dwaproblemy.Po pierwsze, jedynie jeden serwlet w jednym czasie mo¿e nas³uchiwaæna konkretnym porcie.Sprawia to, ¿e absolutnie konieczne staje siê, aby ka¿dyserwlet-demon wybiera³ swój w³asny port po³¹czenia — poprzez ustawienie swojegoparametru inicjacji socketPort, ustawiaj¹c zmienn¹ DEFAULT_PORT przedwywo³aniem super.init(config) lub bezpoœrednim przejêciem getSocketPort().Podrugie, serwlet-demon musi byæ za³adowany na serwer i wywo³ana musi byæ jegometoda init(), zanim bêdzie on móg³ przyjmowaæ przychodz¹ce po³¹czenianie-HTTP.W zwi¹zku z tym nale¿y nakazaæ serwerowi ³adowanie go podczas startu,lub upewniæ siê, ¿e jest on zawsze dostêpny przez HTTP, zanim mo¿na bêdzieuzyskaæ do niego dostêp bezpoœredni.ApletKod apletu ³¹cz¹cego siê z serwletem przy pomocy komunikacji nie-HTTP, przedewszystkim metody pobierzDataPortTekst() i pobierzDataPortObiekt(), jestprzedstawiony w przyk³adzie 10.10.Przyk³ad 10.10.ApletGodziny pobieraj¹cy czas przy pomocy po³¹czenia przez zwyk³y port.import java.net.socket; // Nowy dodatekstatic final int DEFAULT_PORT=1313; // Nowy dodatekprivate int getSocketPort() {try { return Integer.parseInt(getParameter("socketPort")); }catch (NumberFormatException w) { return DEFAULT_PORT; }}private String pobierzDataPortTekst() {InputStream in = null;try {// Ustanowienie po³¹czenia przez port z serwletemSocket port = new Socket(getCodeBase().getHost(), getSocketPort());// wyœwietlenie pustej linii, oznaczaj¹cej chêæ pobrania czasu jako zwyk³egotekstuPrintStream wyj = new PrintStream(port.getOutputStream());wyj.println();wyj.flush();// Odczytanie pierwszej linii odpowiedzi// Powinna ona zawieraæ aktualny czasin = port
[ Pobierz całość w formacie PDF ]