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:45]
jkonczak [Bufory]
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 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 145: Linia 180:
 int bytesWritten; ​                           //            vlimit ​ int bytesWritten; ​                           //            vlimit ​
 bytesWritten = channel2.write(buffer); ​      // ​ |alamakota.......| bytesWritten = channel2.write(buffer); ​      // ​ |alamakota.......|
-assert bytesWritten == 6;                    //            ^pos+assert bytesWritten == 9;                    //            ^pos
  
 buffer.flip(); ​                              // ​ |alamakota.......| buffer.flip(); ​                              // ​ |alamakota.......|
Linia 350: 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.1606239922.txt.gz · ostatnio zmienione: 2020/11/24 18:45 przez jkonczak