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>
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:
W programowaniu sieciowym wyróżnia się dwie główne koncepcje omawiane na zajęciach:
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.
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 zwraca Socket obsługujący klientasetSoTimeout(int timeout) - timeout dla accept()bind(SocketAddress host, int backlog) - wiąże gniazdo z portemKonstruktory 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 gniazdogetByAddress(byte[] addr)getByName(String host)getLocalHost()getHostAddress(), getHostName()
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 pakietWymiana informacji powszechnie odbywa się przez HTTP; popularny format wymiany danych to JSON.
Adres URL ma postać: protokol://host:port/ścieżka?parametry.
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 URLConnectiongetContent(), getContent(Class[] classes)getContentEncoding(), getContentLength(), getContentType()getLastModified(), getExpiration()setDoInput(boolean), setDoOutput(boolean)getInputStream(), getOutputStream()Zestaw linków do dokumentacji używanych klas zamieszczono w materiałach zajęciowych (ServerSocket, Socket, InetAddress, DatagramSocket, DatagramPacket, URL, URLConnection).