Różnice między wybraną wersją a wersją aktualną.
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 użyciem ''java.io''. (Jako klienta użyj programu ''netcat'' lub ''socat''.) | + | ==Multicast== |
+ | 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> | ||
+ | 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]]) |