~~NOCACHE~~ ~~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=1024x768~~ ===== 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 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).