Narzędzia użytkownika

Narzędzia witryny


sk2:java

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
sk2:java [2021/12/21 20:41]
jkonczak [Klasy obsługujące gniazda (kanały)]
sk2:java [2023/12/01 13:08] (aktualna)
jkonczak [Zadania]
Linia 5: Linia 5:
 Obsługa wielu gniazd, operacje blokujące / nieblokujące:​ Obsługa wielu gniazd, operacje blokujące / nieblokujące:​
   * ''​java.io''​ pozwala tylko na blokującą obsługę gniazd i nie ma możliwości sprawdzenia czy możliwe jest wykonanie żądanej operacji bez blokowania (tzn. nie ma możliwości skorzystania z funkcji typu ''​select''/''​poll''​). \\ W praktyce oznacza to, że dla każdego gniazda potrzebny jest osobny wątek.   * ''​java.io''​ pozwala tylko na blokującą obsługę gniazd i nie ma możliwości sprawdzenia czy możliwe jest wykonanie żądanej operacji bez blokowania (tzn. nie ma możliwości skorzystania z funkcji typu ''​select''/''​poll''​). \\ W praktyce oznacza to, że dla każdego gniazda potrzebny jest osobny wątek.
-  * ''​java.nio''​ oferuje mechanizm analogiczny w działaniu do funkcji ​''​poll''​. Przy jego wykorzystaniu narzucana jest nieblokująca obsługa gniazd.+  * ''​java.nio''​ oferuje mechanizm analogiczny w działaniu do mechanizmu ​''​epoll''​. Przy jego wykorzystaniu narzucana jest nieblokująca obsługa gniazd.
  
 Odczyt / zapis danych: Odczyt / zapis danych:
Linia 67: Linia 67:
  
 ==Serwer== ==Serwer==
-Serwer UDP od klient różni się tym, że używa [[https://​docs.oracle.com/​en/​java/​javase/​15/​docs/​api/​java.base/​java/​net/​DatagramSocket.html#​%3Cinit%3E(int)|konstruktora przyjmującego numer portu]] lub metody ''​[[https://​docs.oracle.com/​en/​java/​javase/​15/​docs/​api/​java.base/​java/​net/​DatagramSocket.html#​bind(java.net.SocketAddress)|bind]]''​+Serwer UDP od klient różni się tym, że używa [[https://​docs.oracle.com/​en/​java/​javase/​21/​docs/​api/​java.base/​java/​net/​DatagramSocket.html#​%3Cinit%3E(int)|konstruktora przyjmującego numer portu]] lub metody ''​[[https://​docs.oracle.com/​en/​java/​javase/​21/​docs/​api/​java.base/​java/​net/​DatagramSocket.html#​bind(java.net.SocketAddress)|bind]]''​
  
 ==Multicast== ==Multicast==
-Multicast używa klasy ''​[[https://​docs.oracle.com/​en/​java/​javase/​15/​docs/​api/​java.base/​java/​net/​MulticastSocket.html|MulticastSocket]]''​ która jest klasą ''​DatagramPacket''​ wzbogaconą o kilka metod, m. inn. dołączenie do grupy:+Multicast używa klasy ''​[[https://​docs.oracle.com/​en/​java/​javase/​21/​docs/​api/​java.base/​java/​net/​MulticastSocket.html|MulticastSocket]]''​ która jest klasą ''​DatagramSocket''​ wzbogaconą o kilka metod, m. inn. dołączenie do grupy:
 <code java> <code java>
 MulticastSocket socket = new MulticastSocket(1313);​ MulticastSocket socket = new MulticastSocket(1313);​
Linia 78: Linia 78:
 ++++Od Javy 14 metoda MulticastSocket.joinGroup(InetAddress) jest oznaczona jako deprecated i żeby dodać się na wszystkie interfejsy należy ręcznie dodać się do każdego po kolei| ++++Od Javy 14 metoda MulticastSocket.joinGroup(InetAddress) jest oznaczona jako deprecated i żeby dodać się na wszystkie interfejsy należy ręcznie dodać się do każdego po kolei|
 <code java> <code java>
-MulticastSocketsocket ​= new MulticastSocket(1313);​+MulticastSocket socket ​= new MulticastSocket(1313);​
 Enumeration<​NetworkInterface>​ netIfEnum = NetworkInterface.getNetworkInterfaces();​ Enumeration<​NetworkInterface>​ netIfEnum = NetworkInterface.getNetworkInterfaces();​
 while(netIfEnum.hasMoreElements()){ while(netIfEnum.hasMoreElements()){
     NetworkInterface netIf = netIfEnum.nextElement();​     NetworkInterface netIf = netIfEnum.nextElement();​
     if(netIf.supportsMulticast())     if(netIf.supportsMulticast())
-        socket.joinGroup(new InetSocketAddress(InetAddress.getByName("​239.255.123.45"​),​ 1313), netIf);+        ​try { 
 +            ​socket.joinGroup(new InetSocketAddress(InetAddress.getByName("​239.255.123.45"​),​ 1313), netIf); 
 +        } catch(IOException e) { 
 +        }
 } }
 </​code>​ </​code>​
 ++++ ++++
 +
 ==== Zadania ==== ==== Zadania ====
 <​html><​small></​html>​ <​html><​small></​html>​
 Przypomnienie wątków i synchronizacji w  Javie: Przypomnienie wątków i synchronizacji w  Javie:
 [[https://​docs.oracle.com/​javase/​tutorial/​essential/​concurrency/​locksync.html|synchronized (czyli zamki)]] \\ [[https://​docs.oracle.com/​javase/​tutorial/​essential/​concurrency/​locksync.html|synchronized (czyli zamki)]] \\
-[[https://​docs.oracle.com/​en/​java/​javase/​15/​docs/​api/​java.base/​java/​util/​concurrent/​package-summary.html|java.util.concurrent]] \\+[[https://​docs.oracle.com/​en/​java/​javase/​21/​docs/​api/​java.base/​java/​util/​concurrent/​package-summary.html|java.util.concurrent]] \\
 nowy wątek, używając lambdy: nowy wątek, używając lambdy:
 <code java> <code java>
Linia 101: Linia 105:
  
  
-//Zadanie 1.// Napisz klienta TCP z użyciem ''​java.io''​ i wątków. \\ (Możesz skorzystać z szablonu kodu z TODO's do zrobienia: {{:sk2:tcpclienttemplate.java|TcpClientTemplate.java}})+//Zadanie 1.// Napisz klienta TCP z użyciem ''​java.io''​ i wątków. \\ (Możesz skorzystać z szablonu kodu z TODO's do zrobienia: {{:sk2:TcpClientTemplate.java|tcpclienttemplate.java}}) ​
  
 //Zadanie 2.// Napisz program odbierający i wysyłający wiadomości UDP od/do grupy multicastowej z użyciem ''​java.io''​ i wątków. //Zadanie 2.// Napisz program odbierający i wysyłający wiadomości UDP od/do grupy multicastowej z użyciem ''​java.io''​ i wątków.
 +
 +[[sk2:​qt#​ip_multicast_-_przypomnienie| IP multicast - przypomnienie i komendy do testowania]]
  
 <​html><​small></​html>​ <​html><​small></​html>​
-//Zadanie 3.// Napisz serwer czatu z użyciem ''​java.io''​. (Jako klienta użyj programu ''​netcat''​ lub ''​socat''​.)+//Zadanie 3.// Napisz serwer czatu z użyciem ''​java.io''​. (Jako klienta użyj np. programu ​z zadania 1 lub ''​netcat''​ lub ''​socat''​.)
 <​html></​small></​html>​ <​html></​small></​html>​
  
Linia 115: Linia 121:
 ==== Klasy obsługujące gniazda (kanały) ==== ==== Klasy obsługujące gniazda (kanały) ====
 Ważne klasy (sieciowe): Ważne klasy (sieciowe):
-  * ''​[[https://​docs.oracle.com/​en/​java/​javase/​15/​docs/​api/​java.base/​java/​nio/​channels/​SocketChannel.html|SocketChannel]]''​ – gniazdo TCP (//​connect//,​ klient) +  * ''​[[https://​docs.oracle.com/​en/​java/​javase/​21/​docs/​api/​java.base/​java/​nio/​channels/​SocketChannel.html|SocketChannel]]''​ – gniazdo TCP (//​connect//,​ klient) 
-  * ''​[[https://​docs.oracle.com/​en/​java/​javase/​15/​docs/​api/​java.base/​java/​nio/​channels/​ServerSocketChannel.html|ServerSocketChannel]]''​ – gniazdo TCP (//​listen//,​ serwer) +  * ''​[[https://​docs.oracle.com/​en/​java/​javase/​21/​docs/​api/​java.base/​java/​nio/​channels/​ServerSocketChannel.html|ServerSocketChannel]]''​ – gniazdo TCP (//​listen//,​ serwer) 
-  * ''​[[https://​docs.oracle.com/​en/​java/​javase/​15/​docs/​api/​java.base/​java/​nio/​channels/​DatagramChannel.html|DatagramChannel]]''​ – gniazdo UDP +  * ''​[[https://​docs.oracle.com/​en/​java/​javase/​21/​docs/​api/​java.base/​java/​nio/​channels/​DatagramChannel.html|DatagramChannel]]''​ – gniazdo UDP 
-  * ''​[[https://​docs.oracle.com/​en/​java/​javase/​15/​docs/​api/​java.base/​java/​nio/​channels/​Selector.html|Selector]]''​ – multiplekser+  * ''​[[https://​docs.oracle.com/​en/​java/​javase/​21/​docs/​api/​java.base/​java/​nio/​channels/​Selector.html|Selector]]''​ – multiplekser
 Obiekty z tych klas są tworzone metodą statyczną ''​open()'',​ np: Obiekty z tych klas są tworzone metodą statyczną ''​open()'',​ np:
 <code java> <code java>
Linia 152: Linia 158:
 ==== Bufory ==== ==== Bufory ====
  
-NIO używa dedykowanych klas buforów – np. ''​[[https://​docs.oracle.com/​en/​java/​javase/​14/​docs/​api/​java.base/​java/​nio/​ByteBuffer.html|ByteBuffer]]''​. Klasy te służą opakowaniu tablic (np. tablicy bajtów) w sposób nie ograniczający wydajności.+NIO używa dedykowanych klas buforów – np. ''​[[https://​docs.oracle.com/​en/​java/​javase/​21/​docs/​api/​java.base/​java/​nio/​ByteBuffer.html|ByteBuffer]]''​. Klasy te służą opakowaniu tablic (np. tablicy bajtów) w sposób nie ograniczający wydajności.
  
 Bufor można tworzyć metodami statycznymi,​ np. ''​ByteBuffer.allocate()''​ i ''​ByteBuffer.wrap()''​. Bufor można tworzyć metodami statycznymi,​ np. ''​ByteBuffer.allocate()''​ i ''​ByteBuffer.wrap()''​.
Linia 381: Linia 387:
 ==== Zadania ==== ==== Zadania ====
  
-//Zadanie 4.// Pobierz kod prostego serwera key-value store: {{:​sk2:​simplekv.java|SimpleKV.java}}.+//Zadanie 4.// Pobierz kod prostego serwera key-value store: {{:​sk2:​simplekv.java|simplekv.java}}.
 <​html><​small>​      </​html>​ <​html><​small>​      </​html>​
 ([[https://​en.wikipedia.org/​wiki/​Key-value_database]]) ([[https://​en.wikipedia.org/​wiki/​Key-value_database]])
sk2/java.1640115667.txt.gz · ostatnio zmienione: 2021/12/21 20:41 przez jkonczak