REVEAL theme=simple&disableLayout=0&transition=none&controls=1&show_progress_bar=1&build_all_lists=0&show_image_borders=0&horizontal_slide_level=2&enlarge_vertical_slide_headers=0&show_slide_details=1&open_in_new_window=1&size=1024×768
<html> <style type=„text/css”> p { text-align: left;} .reveal { font-size: 30px; } .reveal section { width: 96%; margin: 0 auto; } .reveal .slides { width: 60% !important; } .reveal ul, .reveal ol { margin-left: 1.5em; } .reveal pre code {
height: 100%; max-height: 100%; box-sizing: border-box; }
</style> </html>
Zajęcia 9. - Programowanie zorientowane sieciowo
Programowanie sieciowe
Dotychczas kod działał lokalnie; obecnie oprogramowanie często komunikuje się z innymi maszynami. Do komunikacji używa się głównie dwóch protokołów:
- TCP - połączeniowy, niezawodny, strumieniowy (działa na IP, dzieli dane na fragmenty).
- UDP - bezpołączeniowy, szybszy, bez mechanizmów retransmisji ani kontroli przepływu.
W programowaniu sieciowym wyróżnia się dwie główne koncepcje omawiane na zajęciach:
- programowanie oparte na gniazdach (sockets)
- przetwarzanie adresów URL (HTTP)
Komunikacja oparta na gniazdach (sockets)
W komunikacji opartej na gniazdach wykorzystuje się TCP. Jeden komputer działa jako serwer, drugi jako klient. Na serwerze tworzy się obiekt gniazda i zaczyna nasłuchiwać; klient zna adres i port serwera i łączy się z nim. Po nawiązaniu połączenia obie strony korzystają ze strumieni wejścia/wyjścia do wymiany danych.
Serwer - java.net.ServerSocket
Konstruktor: public ServerSocket(int port, int backlog, InetAddress address) throws IOException
port- port do nasłuchu (0 - wybór automatyczny)backlog- maks. długość kolejki oczekujących połączeńaddress- adres IP do nasłuchu (przydatne przy wielu adresach)
Metody:
getLocalPort()- zwraca numer portuaccept()- oczekuje na połączenie i zwracaSocketobsługujący klientasetSoTimeout(int timeout)- timeout dlaaccept()bind(SocketAddress host, int backlog)- wiąże gniazdo z portem
Klasa ''Socket'' (klient)
Konstruktory i metody:
Socket(String host, int port, InetAddress localAddress, int localPort)Socket(InetAddress host, int port, InetAddress localAddress, int localPort)Socket()- pusty socket, użyćconnect()connect(SocketAddress host, int timeout)- łączy z serweremgetInetAddress(),getPort(),getLocalPort(),getRemoteSocketAddress()getInputStream(),getOutputStream()- strumienie do komunikacjiclose()- zamyka gniazdo
''InetAddress''
getByAddress(byte[] addr)getByName(String host)getLocalHost()getHostAddress(),getHostName()
Gniazda bezpołączeniowe (UDP)
UDP używa klas DatagramSocket i DatagramPacket.
DatagramSocket' - przykładowe konstruktory:
DatagramSocket()- tworzy gniazdo i łączy z wolnym portemDatagramSocket(int port)- łączy z konkretnym portemDatagramSocket(int port, InetAddress address)- łączy z portem i adresem
DatagramPacket - pakiet danych UDP:
DatagramPacket(byte[] barr, int length)DatagramPacket(byte[] barr, int length, InetAddress address, int port)
Podstawowe metody:
send(DatagramPacket dp)- wysyła pakietreceive(DatagramPacket dp)- odbiera pakiet
Protokół HTTP i przetwarzanie URL
Wymiana informacji powszechnie odbywa się przez HTTP; popularny format wymiany danych to JSON.
Adres URL ma postać: protokol://host:port/ścieżka?parametry.
''java.net.URL'' - konstruktory i metody
URL(String protocol, String host, int port, String file)URL(String protocol, String host, String file)URL(String url)getPath(),getQuery(),getAuthority(),getPort(),getDefaultPort(),getProtocol(),getHost(),getFile(),getRef()openConnection()- zwracaURLConnection
''java.net.URLConnection'' - wybrane metody
getContent(),getContent(Class[] classes)getContentEncoding(),getContentLength(),getContentType()getLastModified(),getExpiration()setDoInput(boolean),setDoOutput(boolean)getInputStream(),getOutputStream()
Dokumentacja
Zestaw linków do dokumentacji używanych klas zamieszczono w materiałach zajęciowych (ServerSocket, Socket, InetAddress, DatagramSocket, DatagramPacket, URL, URLConnection).