Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
sk2:java [2022/11/23 12:45] jkonczak [UDP] |
sk2:java [2023/12/01 13:08] (aktualna) jkonczak [Zadania] |
||
---|---|---|---|
Linia 67: | Linia 67: | ||
==Serwer== | ==Serwer== | ||
- | Serwer UDP od klient różni się tym, że używa [[https://docs.oracle.com/en/java/javase/19/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/19/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/19/docs/api/java.base/java/net/MulticastSocket.html|MulticastSocket]]'' która jest klasą ''DatagramSocket'' 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 90: | Linia 90: | ||
</code> | </code> | ||
++++ | ++++ | ||
- | |||
- | <html><small></html> | ||
- | Użycie IP multicast w BSD socket API: [[sk2:multicast_example]]\\ | ||
- | Lista grup mcastowych do których jest zapisany komputer: ''ip maddr'' lub ''netstat -ng'' lub ''cat /proc/net/igmp'' | ||
- | ++++ Użycie programu socat do testowania multicastu: | | ||
- | Zajęcia w laboratorium: | ||
- | <code bash> | ||
- | socat UDP-DATAGRAM:239.0.0.1:2000,reuseaddr,bind=0.0.0.0:2000,ip-add-membership=239.0.0.1:enp3s0 STDIO | ||
- | |||
- | # UDP-DATAGRAM:239.0.0.1:2000 → wysyłaj datagramy do podanego adresu (239.0.0.1:2000) i odbieraj co przyjdzie | ||
- | # reuseaddr → włącze SO_REUSEADDR; pozwala wielu programom na tym samym komputerze używać tego samego portu do mcastu | ||
- | # ip-add-membership=239.0.0.1:enp3s0 → dołącza do grupy mcastowej 239.0.0.1 na urządzeniu enp3s0 | ||
- | # bind=0.0.0.0:2000 → wykonaj bind na podany adres; pod tym adresem będą odbierane datagramy | ||
- | </code> | ||
- | |||
- | Zajęcia zdalne: | ||
- | <code bash> | ||
- | socat UDP-DATAGRAM:239.0.0.1:2000,reuseaddr,bind=0.0.0.0:2000,ip-add-membership=239.0.0.1:tap0,ip-multicast-if=10.0.9.X STDIO | ||
- | |||
- | # UDP-DATAGRAM:239.0.0.1:2000 → wysyłaj datagramy do podanego adresu (239.0.0.1:2000) i odbieraj co przyjdzie | ||
- | # reuseaddr → włącze SO_REUSEADDR; pozwala wielu programom na tym samym komputerze używać tego samego portu do mcastu | ||
- | # ip-add-membership=239.0.0.1:tap0 → dołącza do grupy mcastowej 239.0.0.1 na urządzeniu tap0 | ||
- | # bind=0.0.0.0:2000 → wykonaj bind na podany adres; pod tym adresem będą odbierane datagramy | ||
- | # ip-multicast-if=10.0.9.X → nakazuje wysyłać wiadomości do grupy multicastowej z podanego adresu | ||
- | </code> | ||
- | ++++ | ||
- | <html></small></html> | ||
==== Zadania ==== | ==== Zadania ==== | ||
Linia 122: | Linia 95: | ||
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/19/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 132: | 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> | ||
Linia 146: | 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/19/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/19/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/19/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/19/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 183: | Linia 158: | ||
==== Bufory ==== | ==== Bufory ==== | ||
- | NIO używa dedykowanych klas buforów – np. ''[[https://docs.oracle.com/en/java/javase/19/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 412: | 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]]) |