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 [2020/11/24 18:16]
jkonczak [Bufory]
sk2:java [2023/12/01 13:08]
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 48: Linia 48:
 </​code>​ </​code>​
  
-==== Klient ​UDP ====+==== UDP ==== 
 + 
 +== Klient ​==
 <code java> <code java>
 DatagramSocket sock = new DatagramSocket();​ DatagramSocket sock = new DatagramSocket();​
Linia 64: Linia 66:
 </​code>​ </​code>​
  
-==== Zadanie 1====+==Serwer== 
 +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]]''​
  
-Napisz serwer czatu z yciem ''​java.io''​(Jako klienta użyj programu ​''​netcat'' ​lub ''​socat''​.)+==Multicast== 
 +Multicast ​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, minn. dołączenie do grupy: 
 +<code java> 
 +MulticastSocket socket = new MulticastSocket(1313);​ 
 + 
 +socket.joinGroup(InetAddress.getByName("​239.255.123.45"​));​ 
 +</​code>​ 
 +++++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> 
 +MulticastSocket socket = new MulticastSocket(1313);​ 
 +Enumeration<​NetworkInterface>​ netIfEnum = NetworkInterface.getNetworkInterfaces();​ 
 +while(netIfEnum.hasMoreElements()){ 
 +    NetworkInterface netIf = netIfEnum.nextElement();​ 
 +    if(netIf.supportsMulticast()) 
 +        try { 
 +            socket.joinGroup(new InetSocketAddress(InetAddress.getByName("​239.255.123.45"​),​ 1313), netIf); 
 +        } catch(IOException e
 +        } 
 +
 +</​code>​ 
 +++++
  
 +==== Zadania ====
 <​html><​small></​html>​ <​html><​small></​html>​
 +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/​14/​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 79: Linia 104:
 <​html></​small></​html>​ <​html></​small></​html>​
  
 +
 +//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.
 +
 +[[sk2:​qt#​ip_multicast_-_przypomnienie| IP multicast - przypomnienie i komendy do testowania]]
 +
 +<​html><​small></​html>​
 +//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>​
  
 ====== java.nio ====== ====== java.nio ======
Linia 86: 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/​14/​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/​14/​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/​14/​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/​14/​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 123: 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 129: Linia 164:
 Każdy bufor ma stałą pojemność. Poza pojemnością każdy bufor ma kursor (''​position''​) i limit (''​limit''​)((oraz znacznik, ''​mark''​)). Pisanie i czytanie odbywa się zawsze od kursora i przesuwa kursor o ilość przeczytanych/​zapisanych bajtów.\\ Każdy bufor ma stałą pojemność. Poza pojemnością każdy bufor ma kursor (''​position''​) i limit (''​limit''​)((oraz znacznik, ''​mark''​)). Pisanie i czytanie odbywa się zawsze od kursora i przesuwa kursor o ilość przeczytanych/​zapisanych bajtów.\\
 Do zmiany pozycji i limitu służą np. ''​flip'',​ ''​clear''​. Do zmiany pozycji i limitu służą np. ''​flip'',​ ''​clear''​.
 +<​html><​small></​html>​
 <code java> <code java>
 ByteBuffer buffer = ByteBuffer.allocate(16);​ //  |................| ByteBuffer buffer = ByteBuffer.allocate(16);​ //  |................|
                                              // ​  ​^pos(ition) ​    ​^limit                                              // ​  ​^pos(ition) ​    ​^limit
-                                              +int bytesRead;​ 
-int bytesRead = channel.read(buffer); ​       //  |alamakota.......| +bytesRead = channel.read(buffer); ​           // ​ |ala.............| 
-assert bytesRead == 9;                       // ​           ^pos   ​^limit+assert bytesRead == 3;                       // ​     ^pos         ​^limit 
 +                                             
 +bytesRead = channel.read(buffer); ​           ​//  |alamakota.......| 
 +assert bytesRead == 6;                       // ​           ^pos   ​^limit 
 + 
 +buffer.flip(); ​                              // ​ |alamakota.......| 
 +                                             // ​  ​^pos ​    ​^limit 
 + 
 +int bytesWritten; ​                           //            vlimit  
 +bytesWritten = channel2.write(buffer); ​      // ​ |alamakota.......| 
 +assert bytesWritten == 9;                    //            ^pos
  
 buffer.flip(); ​                              // ​ |alamakota.......| buffer.flip(); ​                              // ​ |alamakota.......|
Linia 149: Linia 195:
                                              // ​  ​^pos ​           ^limit                                              // ​  ​^pos ​           ^limit
 </​code>​ </​code>​
 +<​html></​small></​html>​
  
 ==== SelectionKey ==== ==== SelectionKey ====
Linia 338: Linia 385:
 </​code>​ </​code>​
 ++++ ++++
-==== Zadanie 2. ====+==== Zadania ​====
  
-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.txt · ostatnio zmienione: 2023/12/01 13:08 przez jkonczak