Gniazdka serwerów
Rola serwera
Nasłuch w sieci na próby połączenia ze strony klientów
Komunikacja z klientami
Przetwarzanie danych i udostępnianie zasobów
Zamknięcie połączenia
Nasłuch na kolejnych klientów
Po co serwer w Java
Do obsługi klientów napisanych w Java nie jest konieczny serwerów napisany w java
Serwer może być napisany w dowolnym języku
Jednak aby język byt w pełni funkcjonalny wprowadzono możliwość pisania serwerów
Serwer w Java
Do budowy serwera stosujemy klasę SerwerSocket z pakietu java.net.*
Klasa ta dostarcza wszystkich potrzebnych konstruktorów do założenia gniazdek potrzebnych do komunikacji
Dostarcza potrzebne metody
Cykl życia serwera
Na określonym porcie tworzony jest nowy obiekt SerwerSocket
Serwer czeka na próbę nawiązania połączenia korzystając z metody accept(), która zwraca obiekt Socket łączący klienta i serwer
Wywoływana jest metoda strumieniowa dla obiektu Socket dla zapewnienia komunikacji strumieniowej między klientem i serwerem [gctOmputStrim(), getInputStrim()].
Wymiana danych
Zamykanie połączenia
Serwer wraca do punktu 2
Obsługa kilku klientów
Serwery Unix'owe do obsługi kolejnych klientów stosują nowe procesy
W Java zalecane jest aby każdego klienta obsługiwać w osobnym wątku
Zgłoszeniu od klienlóu system operacyjny obsługuje przez kolejkę FIFO. Zwykle jest to ograniczone do 50 klientów.
Obsługą kolejkowania klientów zajmuje się system operacyjny, nie programista (może on jednak zmienić liczbą klientów w kolejce, ale nie może przekroczyć ograniczenia nakładanego przez system)
Obsługa kilku klientów
Klienci powinni pracować w wątkach a niejako procesy potomne.
Klasa SerwerSocket
Konstruktory
public SocketSerwer (int port) throws IOException,
BindException
public SocketSerwer (int port, ąueueLength} throws
IOException, BindException
public SocketSerwer (int port, ąueueLength.
IntAddress bindAddress) throws IOException
Konstruktory
pnblic SocketSer\ver (int port) throws TOExccption, BindException
Tworzy gniazdo serwera w porcie określonym jako argument. Gdy 0 to numer portu jest wybierany automatycznie.
Wyjątek jest zgłaszany gdy nie można utworzyć gniazda i powiązać go z portem.
- port jest zajęty
- dla portów l - 1023 w UNIK wymagane są uprawnienia ROOT
try{ SerwerSocket httpd = new SerwerSocket(80):} Catch(IOExceptione){System.err.println(e);}
Przykład
import java.net.*;imporlJLna.io.*:;
public class LocalPortScanner {
public static void main(String[] args) {
for (int port = l; port <= 65535; port++) {
try {// Następna linia spowoduje błąd i przejdzie do bloku catch, jeśli na porcie działa już serwer
ServerSocket server = new ServerSocket(port);
}
catch (IOException e) {
System.out.println("Na porcie " + port + "działa serwer.");
} // koniec try
} // koniec for }}
Obsługa pojedynczego klienta
ServerSocket serwer = new ServerSocket(5776);
while( tnie) {
Socket connection = new serwer.acceptf); //nasłuch
OutputStreamWriter out = new
OutputStreamWriter(cormection.getOtputStrearri());
out.write("Połaczyłeś się?");
connection.close(); }
Sytuacje wyjątkowe.
..złgoszone przez:
ServerSocket - powinny zamykać serwer i informować o błędzie
Socket - powinny zamykać aktywne połączenie
access() - przypadek pośredni, który można obsłużyć według sposobu l lub 2.
Obsługa tylu wyjątków spowoduje zagnieżdżanie bloków try.
Pobieranie informacji o gniazdach
public InetAddress getInetAddress()
Zwraca adres używany przez serwer (lokalny)
Jeżeli ma kilka adresów to może zwrócić dowolny
try{
ServerSocket httpd = new ServerSoclcet(80);
InetAddress ai = htlpd.getInetAddress();
}
Catch (IOException e){
}
Pobieranie informacji o gniazdach
public InetAddress getLocalPort()
Pozwala sprawdzić na którym porcie nasłuchuje serwer
Przydaje się gdy gniazdko zostało założone z nr portu=0 czyli pracuje na anonimowym porcie.
Opcje gniazdek
SO_TIMEOUT - jest to jedyna opcja serwera. Pozwala ustalić czas jaki ma oczekiwać metoda acccss() na podłączenie klienta zanim zgłosi wyjątek java.io.InterruptedIOException
Gdy SO_TIMEOUT=0 to access() - brak limitu.
Parametr ten jest bardzo rzadko stosowany.