Ślad: • sidebar_python • 10_net_pa

Zajęcia 9. - Programowanie zorientowane sieciowo

Writing /home/grochu/public_html/wiki/data/meta/zajecia/java/10_net_pa.meta failed
Unable to save metadata file. Hint: disk full; file permissions; safe_mode setting.
Writing /home/grochu/public_html/wiki/data/meta/zajecia/java/sidebar.meta failed

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>

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 portu
  • accept() - oczekuje na połączenie i zwraca Socket obsługujący klienta
  • setSoTimeout(int timeout) - timeout dla accept()
  • 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 serwerem
  • getInetAddress(), getPort(), getLocalPort(), getRemoteSocketAddress()
  • getInputStream(), getOutputStream() - strumienie do komunikacji
  • close() - 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 portem
  • DatagramSocket(int port) - łączy z konkretnym portem
  • DatagramSocket(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 pakiet
  • receive(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() - zwraca URLConnection

''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).