Komunikacj -gniazdka
Zalety gniazdek
Zwalnia programistę z dbania o odpowiednią obsługę komunikacji sieciowej
Pozwala na zapis i odczyt danych z sieci jak ze zwykłego pliku lub dowolnego urządzenia we/wy
Można stosować wszystkie metody strumieniowe
Operacje na gniazdkach
Utworzyć gniazdko
Połączeniowe
Nasłuchowe
Utworzenie strumienia wejściowego lub wyjściowego
Przesłanie danych
Zamkniecie gniazda
Rodzaje gniazd
Połączeniowe
Nasłuchowe
Detagramowe
Unicast
Multicast
Gniazdo połączeniowe
Występuje u klientów - gniazdo aktywne -nawiązuje połączenie
Po nawiązaniu połączenia gotowe jest do przekazywania danych
Po zakończeniu przesyłania danych następuje zamknięcie gniazda przez:
1. Klienta lub
2.Serwer
Gniazdo nasłuchowe
Nie można przesyłać prze nie danych
Występuje w serwerach
Stosowane tylko do nasłuchu żądań od klientów
Gdy przyjdzie żądanie od klienta zostanie ono obsłużone przez serwer, w wyniku tego powstanie zwykłe gniazdo poprzez które odbywa się komunikacja
Następnie przechodzi do nasłuchu
Gniazdo detagramowe
Brak połączenia
Te same gniazda u klienta i serwera
Gniazda po utworzeniu są gotowe do „pracy"
Na serwerze należy podać numer portu
Każdy detagram musi zawierać adres docelowy
Brak pewności dostarczenia danych
Gniazda Unicast i Multicast
Unicast - komunikacja typu punkt-punkt, znany jest nadawca i odbiorca
Wszystkie przedstawione do tej poru gniazdka były typu unicast
Mutlicast — adresowanie grupowe — nie ma określonego odbiorcy. Jest to typowe rozgłaszanie (broadcasting) oparty na protokole UDP
Wejścia i wyjścia w Java
Wymiana danych opiera się na strumieniach
Strumienie są stosowane do obsługi plików, monitora, drukarki itd.
Stosuje się je również do obsługi komunikacji sieciowej.
Do operacji na różnych strumieniach używamy tych samych metod.
W Java strumienie obsługiwane są przez pakiet java.io.*.
Strumienie wyjściowe
Java.io.OutputStream
public abstract void write (int b) throws IOException
public abstract void write (byte []bata) throws ]OExceptior
public void close () throws IOException
Podklasy OutputStream używają tych metod do zapisywania do odpowiednich nośnikach np.
FileOutputStream - zapisuje do pliku
TelnetOutputStream - zapisuje do sieci w protokole Telnet
Strumienie wejściowe
Java.io.lnputStream
public abstract int read () throws IOE\ception
public abstract void read (byte [Jbata) throws IOException
public void close () throws IOException
Podklasy InputStream używają tych metod do odczytywania danych odpowiedniego nośnika np.
FilelnputStream - odczyt z pliku
TelnetlnputStrcam - odczyt z sieci w protokole Telnet
Gniazda klientów
Klasa j a va.net. Socket - operacje TCP po stronie klienta
Jej metody zestawiają i zrywają połączenia
Ustawiają różne parametry komunikacji
Pozwala na standardowe operacje strumieniowe - zapis i odczyt
Klasa Socket - konstruktory
pnblic Socket(String host, int port) throws UnnuwnHostException, IOException
host - nazwa hosta w postaci stringu nie adresu URL
port - numer portu
Gdy nie rozpoznaje nazwy zgłasza:
UnnownHostException
Gdy gniazdo nie zostało otworzone zgłasza:
IOException
Przykładowe wywołanie konstruktora
tray{
Socjet toOR = New Socket („WWW,or,com,80);
// wysyłanie i odbiór danych …
}
catch (UnkownHostException e) {
System.err.println(e);
}
catch (IOException e){
System.err.println (e)
}
Klasa Socket - konstruktory
pnblic Socket(InetAdress host, int port) throws UnnownHostF.xception, IOException
host - nazwa hosta w postaci adresu URL lub IP a nie nazwy
port - numer portu
Gdy host jest nieznany - adres jest niewłaściwy zgłaszany jest wyjątek : UnnownHostException
Gdy nie może się połączyć wówczas zgłasza:
IOException
Przykładowe wywołanie konstruktora
tray{
InetAddress _OR =InetAddress,
getByName("www.or.com");
Socket to_OR = new Socket{_OR,80);
//wysyłanie i odbiór danych ,..
}
catch (UnkownHostException e) {
System,err,printlnl(e);
}
catch (IOException e){
System,err,println(e)
}
Klasa Socket - konstruktory
public Socket(String host, int port, InetAddress interfeace, int localPort) throws IOException
public Socket(InetAddress host, int port, InetAddress interfeace, int localPort) throws IOException
Gdy wystąpi jakaś sytuacja wyjątkowa zgłasza: IOException
Pobieranie informacji z gniazda
public InetAdress get!netAddress() - informuje o podłączonym hoście
Pobieranie informacji z gniazda
pnblic int getPortf) - infonnuje o numerze portu zdalnego hosta do którego jest podłączone gniazdo
public int getLocalPort() - informuje o numerze portu lokalnego
public int getLocalAddress() - informuje, który interfejs sieciowy jest powiązany z gniazdemiowa przy pomocy gniazdek
public InputStream get!nputStream() throws IOException
- Zwraca strumień wejściowy, który może wczytać dane z gniazda do programu
- Program odczytuje dane ze strumienia przy pomocy metody read()
Wysłanie informacji do gniazda
public InputStream getOutputStream() throws IOException
- Zwraca strumień wyjściowy, który może wysłać dane z programu do zdalnego gniazda
- Program wysyła dane do strumienia przy pomocy metody write()
Zamykanie gniazdek
public synchronized void closc() throws IOException
Opcje gniazd
TCP_NODELAY - gdy tnie dane zostaną wysłane jak najszybciej niezależnie od rozmiaru pakietu.
SO_TIMEOUT - gdy „ustawiona", przy odczytywaniu danych z gniazda blokowana jest metoda read() na określony czas a nie do zakończenia odczytu, jak było wcześniej
SO_LTNGER - określa jak długo trzeba czekać przy metodzie close() gdy w gniazdku są nie wysłane dane. Gdy jest O to dane są natychmiast wyrzucane i gniazdo zamykane
SO_SNDBUF - określa rozmiar bufora nadawczego w KB wykorzystywanego w wyjściu sieciowym. Obsługiwane od Java 2likacja sieciowa przy pomocy gniazdek
SO_RCVBUF - określenie wielkości bufor a stosowanego przy odbiorze danych. Występuje w Java 2.
SO_KEEPALIVE - ustawienie opcji na true spowoduje, że klient będzie co pewien czas (2 godz.) wysyłał pakiet sprawdzający czy serwer działa. Jeśli po 12 min stwierdzi że nie działa to zamknie połączenie.