<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://www.if.pw.edu.pl/~lgraczyk/wiki/skins/common/feed.css?270"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?action=history&amp;feed=atom&amp;title=SK_Zadanie_4_Remote</id>
		<title>SK Zadanie 4 Remote - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?action=history&amp;feed=atom&amp;title=SK_Zadanie_4_Remote"/>
		<link rel="alternate" type="text/html" href="http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?title=SK_Zadanie_4_Remote&amp;action=history"/>
		<updated>2026-04-06T13:10:00Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.16.5</generator>

	<entry>
		<id>http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?title=SK_Zadanie_4_Remote&amp;diff=2611&amp;oldid=prev</id>
		<title>Lgraczyk: /* Klient */</title>
		<link rel="alternate" type="text/html" href="http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?title=SK_Zadanie_4_Remote&amp;diff=2611&amp;oldid=prev"/>
				<updated>2020-11-26T11:54:55Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Klient&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Older revision&lt;/td&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Revision as of 11:54, 26 November 2020&lt;/td&gt;
		&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 190:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 190:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;  public static void main(String[] args) throws IOException {&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;  public static void main(String[] args) throws IOException {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  String message = &amp;quot;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;tekst&lt;/del&gt;&amp;quot;;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  String message = &amp;quot;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;wiadomosc od klienta&lt;/ins&gt;&amp;quot;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  InetAddress serverAddress = InetAddress.getByName(&amp;quot;localhost&amp;quot;);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  InetAddress serverAddress = InetAddress.getByName(&amp;quot;localhost&amp;quot;);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  System.out.println(serverAddress);&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  System.out.println(serverAddress);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Lgraczyk</name></author>	</entry>

	<entry>
		<id>http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?title=SK_Zadanie_4_Remote&amp;diff=2608&amp;oldid=prev</id>
		<title>Lgraczyk at 11:14, 26 November 2020</title>
		<link rel="alternate" type="text/html" href="http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?title=SK_Zadanie_4_Remote&amp;diff=2608&amp;oldid=prev"/>
				<updated>2020-11-26T11:14:39Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Older revision&lt;/td&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Revision as of 11:14, 26 November 2020&lt;/td&gt;
		&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 3:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 3:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; |}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; |}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;'''UWAGA! Zajęcia 4 - nowa kolejność'''&amp;lt;/span&amp;gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==Zadania==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==Zadania==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Zadanie 1 ===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Zadanie 1 ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;(Unicast) &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;W parach modyfikujemy &lt;/del&gt;podane na stronie przykłady:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;(Unicast) &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Modyfikujemy &lt;/ins&gt;podane na stronie przykłady:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Klient:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Klient:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 24:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 23:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;(Broadcast) Tworzymy program, który pozwala na sprawdzenie listy obecności na zajęciach (widocznej dla każdego użytkownika sieci).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;(Broadcast) Tworzymy program, który pozwala na sprawdzenie listy obecności na zajęciach (widocznej dla każdego użytkownika sieci).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;W parach tworzymy &lt;/del&gt;jeden program, który wysyła i odbiera dane jednocześnie (2 wątki):&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Tworzymy &lt;/ins&gt;jeden program, który wysyła i odbiera dane jednocześnie (2 wątki):&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Pierwszy wątek (odbierający): w pętli nasłuchuje na wybranym porcie (np. 9111) i jeśli coś otrzyma to wyświetla na ekran w formacie &amp;lt;Wiadomosc&amp;gt; &amp;lt;IP&amp;gt; &amp;lt;PORT&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Pierwszy wątek (odbierający): w pętli nasłuchuje na wybranym porcie (np. 9111) i jeśli coś otrzyma to wyświetla na ekran w formacie &amp;lt;Wiadomosc&amp;gt; &amp;lt;IP&amp;gt; &amp;lt;PORT&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Drugi wątek (wysyłający): w pętli co 1 s wysyła na adres Broadcast pakiet z informacją o loginie (tekst &amp;lt;Imie&amp;gt;).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Drugi wątek (wysyłający): w pętli co 1 s wysyła na adres Broadcast pakiet z informacją o loginie (tekst &amp;lt;Imie&amp;gt;).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 249:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 248:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Zadanie 1 ===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;=== Zadanie 1 ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;(Unicast) &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;W parach modyfikujemy &lt;/del&gt;powyższe przykłady:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;(Unicast) &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Modyfikujemy &lt;/ins&gt;powyższe przykłady:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Klient:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Klient:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 265:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 264:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;(Broadcast) Tworzymy program, który pozwala na sprawdzenie listy obecności na zajęciach (widocznej dla każdego użytkownika sieci).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;(Broadcast) Tworzymy program, który pozwala na sprawdzenie listy obecności na zajęciach (widocznej dla każdego użytkownika sieci).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;W parach tworzymy &lt;/del&gt;jeden program, który wysyła i odbiera dane jednocześnie (2 wątki):&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Tworzymy &lt;/ins&gt;jeden program, który wysyła i odbiera dane jednocześnie (2 wątki):&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Pierwszy wątek (odbierający): w pętli nasłuchuje na wybranym porcie (np. 9111) i jeśli coś otrzyma to wyświetla na ekran w formacie &amp;lt;Wiadomosc&amp;gt; &amp;lt;IP&amp;gt; &amp;lt;PORT&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Pierwszy wątek (odbierający): w pętli nasłuchuje na wybranym porcie (np. 9111) i jeśli coś otrzyma to wyświetla na ekran w formacie &amp;lt;Wiadomosc&amp;gt; &amp;lt;IP&amp;gt; &amp;lt;PORT&amp;gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Drugi wątek (wysyłający): w pętli co 1 s wysyła na adres Broadcast pakiet z informacją o loginie (tekst &amp;lt;Imie&amp;gt;).&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;* Drugi wątek (wysyłający): w pętli co 1 s wysyła na adres Broadcast pakiet z informacją o loginie (tekst &amp;lt;Imie&amp;gt;).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Lgraczyk</name></author>	</entry>

	<entry>
		<id>http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?title=SK_Zadanie_4_Remote&amp;diff=2607&amp;oldid=prev</id>
		<title>Lgraczyk: Created page with &quot;  {| align=&quot;right&quot;   | __TOC__   |}  &lt;span style=&quot;color:red&quot;&gt;'''UWAGA! Zajęcia 4 - nowa kolejność'''&lt;/span&gt;  ==Zadania==  === Zadanie 1 === (Unicast) W parach modyfikujemy pod...&quot;</title>
		<link rel="alternate" type="text/html" href="http://www.if.pw.edu.pl/~lgraczyk/wiki/index.php?title=SK_Zadanie_4_Remote&amp;diff=2607&amp;oldid=prev"/>
				<updated>2020-11-26T10:40:36Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;  {| align=&amp;quot;right&amp;quot;   | __TOC__   |}  &amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;&amp;#39;&amp;#39;&amp;#39;UWAGA! Zajęcia 4 - nowa kolejność&amp;#39;&amp;#39;&amp;#39;&amp;lt;/span&amp;gt;  ==Zadania==  === Zadanie 1 === (Unicast) W parach modyfikujemy pod...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;  {| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;'''UWAGA! Zajęcia 4 - nowa kolejność'''&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zadania==&lt;br /&gt;
&lt;br /&gt;
=== Zadanie 1 ===&lt;br /&gt;
(Unicast) W parach modyfikujemy podane na stronie przykłady:&lt;br /&gt;
&lt;br /&gt;
Klient:&lt;br /&gt;
* Klient po uruchomieniu wysyła “Imię Nazwisko” (np. “Adam Szczurek”) użytkownika do serwera. Następnie odbiera potwierdzenie otrzymania wiadomości z serwera.&lt;br /&gt;
* Dalej klient pyta użytkownika, czy chce poznać nazwiska innych, którzy łączyli się do serwera (y/n).&lt;br /&gt;
** Jeśli tak, to wysyła &amp;quot;y&amp;quot; do serwera, a następnie pobiera od niego pakiet z odpowiedzią i wyświetla ją na ekranie.&lt;br /&gt;
** Jeśli nie, to kończy działanie.&lt;br /&gt;
&lt;br /&gt;
Serwer:&lt;br /&gt;
* Serwer w pętli przyjmuje pakiety przychodzące.&lt;br /&gt;
**Jeśli przychodząca wiadomość nie jest równa y (!message.equals(&amp;quot;y&amp;quot;)), to  dodaje kolejnych użytkowników do tablicy: ArrayList&amp;lt;String&amp;gt; clients = new ArrayList&amp;lt;String&amp;gt;(); i przesyła do klienta tekst “Dodano klienta o nazwie: &amp;lt;nazwa&amp;gt;”.&lt;br /&gt;
** Jeśli serwer otrzyma “y”, to przesyła do klienta zawartość tablicy clients.&lt;br /&gt;
&lt;br /&gt;
=== Zadanie 2 ===&lt;br /&gt;
(Broadcast) Tworzymy program, który pozwala na sprawdzenie listy obecności na zajęciach (widocznej dla każdego użytkownika sieci).&lt;br /&gt;
&lt;br /&gt;
W parach tworzymy jeden program, który wysyła i odbiera dane jednocześnie (2 wątki):&lt;br /&gt;
* Pierwszy wątek (odbierający): w pętli nasłuchuje na wybranym porcie (np. 9111) i jeśli coś otrzyma to wyświetla na ekran w formacie &amp;lt;Wiadomosc&amp;gt; &amp;lt;IP&amp;gt; &amp;lt;PORT&amp;gt;.&lt;br /&gt;
* Drugi wątek (wysyłający): w pętli co 1 s wysyła na adres Broadcast pakiet z informacją o loginie (tekst &amp;lt;Imie&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Zadanie 3 ===&lt;br /&gt;
(Multicast) Przerabiamy program z Zadania 2, aby działał na multicast.&lt;br /&gt;
&lt;br /&gt;
== Protokół UDP ==&lt;br /&gt;
UDP (User Datagram Protocol) jest protokołem transmisji danych, który ma następujące własności:&lt;br /&gt;
* Jest bezstanowy (tj. do wysłania komunikatu nie trzeba nawiązywać połączenia)&lt;br /&gt;
* Pakietowy (wysyłamy pakiety)&lt;br /&gt;
* Nie zapewnia retransmisji danych&lt;br /&gt;
* Opcjonalnie: zawiera sumę kontrolną&lt;br /&gt;
* Umożliwia wysyłanie danych do wielu użytkowników&lt;br /&gt;
&lt;br /&gt;
== Zastosowania UDP ==&lt;br /&gt;
* '''Wysyłanie danych do wielu użytkowników'''&lt;br /&gt;
Na przykład synchronizacja plików między wieloma serwerami w jednej sieci. Jeden z serwerów wysyła te same dane do wszystkich podłączonych klientów.&lt;br /&gt;
&lt;br /&gt;
* '''Usługi zero-konfiguracji'''&lt;br /&gt;
W protokole TCP usługi, które pisaliśmy wymagały posiadania numeru IP serwera. Jest to całkiem uciążliwe w małych sieciach i sieciach ad-hoc. Chcielimbyśmy, by nasza sieć działała tak, że po podłączeniu nasz system może wykryć wszystkie usługi widoczne w sieci.&lt;br /&gt;
&lt;br /&gt;
Tego typu rozwiązania często implementuje się za pomocą UDP. Przykładem może być usługa NetBIOS, będąca częścią systemu sieciowego systemu Microsoft Windows (odpowiednik w systemach Linux nazywa się SAMBA).&lt;br /&gt;
&lt;br /&gt;
* '''Sieci peer-to-peer'''&lt;br /&gt;
Część sieci peer-to-peer korzysta z UDP zamiast z TCP, ponieważ nie potrzebują obsługi błędów (same posiadają sumy kontrolne poszczególnych plików, nie potrzebujemy zatem kontroli na poziomie protokołu).&lt;br /&gt;
&lt;br /&gt;
* '''Wysyłanie wielu małych pakietów'''&lt;br /&gt;
Kiedy nasz system wysyla wiele krótkich wiadomości do wielu innych systemów. W takim przypadku okazuje się, że narzut na procedurę handshake TCP jest jest zbyt duży i całość działa mało wydajnie.&lt;br /&gt;
&lt;br /&gt;
Przykład: protokół ustalania czasu (Network Time Protocol) korzysta z UDP do komunikacji z klientami.&lt;br /&gt;
&lt;br /&gt;
* '''Rozwiązania wymagające niskich opóźnień (latencji)'''&lt;br /&gt;
W przypadku streamingu mediów (audio, video), czy oprogramowania gier sieciowych ważne jest, to by opóźnienie przesłanych informacji było minimalne.&lt;br /&gt;
&lt;br /&gt;
== Broadcast ==&lt;br /&gt;
Broadcast jest w zasadzie funkcjonalnością protokołu IP, ale skoro nie można z niego skorzystać z poziomu TCP to mówimy o nim dopiero teraz.&lt;br /&gt;
&lt;br /&gt;
Załóżmy że mamy podsieć o masce: &amp;lt;code&amp;gt;255.255.254.0&amp;lt;/code&amp;gt; i adresie IP &amp;lt;code&amp;gt;194.29.174.123&amp;lt;/code&amp;gt;, to jeśli wyślemy pakiet na adres &amp;lt;code&amp;gt;194.29.175.255&amp;lt;/code&amp;gt; (adres w którym wszystkie miejsa w których maska przyjmuje wartość 0 są zamienione na 1) wiadomość taka zostanie wysłana do wszystkich komputerów w danej podsieci.&lt;br /&gt;
&lt;br /&gt;
Maska podsieci (zapisana binarnie):&lt;br /&gt;
&lt;br /&gt;
 11111111 11111111 11111110 00000000&lt;br /&gt;
&lt;br /&gt;
Adres komputera (zapisany binarnie):&lt;br /&gt;
&lt;br /&gt;
 11000010 00011101 10101110 01111011&lt;br /&gt;
&lt;br /&gt;
Adres Broadcast (zapisany binarnie):&lt;br /&gt;
&lt;br /&gt;
 11000010 00011101 10101111 11111111&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Multicast ==&lt;br /&gt;
Przesyłanie informacji od wszystkich użytkowników danej podsieci ma wiele zastosowań, ale ma poważne ograniczenia - wiadomości broadcast generalnie są wycinane przez routery, i nie nadają się do komunikacji poza siecią lokalną.&lt;br /&gt;
&lt;br /&gt;
Rozważmy przykładowo telewizję internetową: jeśli korzysta z wiadomości '''unicast''' (do jednego odbiorcy) ilość pakietów które wysyła rośnie liniowo z ilością odbiorców - mimo, że każdy odbiorca dostaje taki sam obraz (a w zasadzie: taką samą listę pakietów).&lt;br /&gt;
&lt;br /&gt;
By rozwiązać takie problemy stworzono wiadomości multicast, działają one w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
Zdefiniowano podsieć &amp;lt;code&amp;gt;224.0.0.0/4&amp;lt;/code&amp;gt; jako podsieć zawierającą adresy multicast, adresy z tego zakresu te są przydzielane przez organizację '''IANA'''. Adresy te jednak nie oznaczają żadnych hostów, ale ''grupy multicast''. Poszczególne komputery mogą wyrazić zainteresowanie uczestniczeniem w danej grupie multicast, informację tą wysyłają do swojego najbliższego routera (który, jeśli to konieczne, przesyła ową informację dalej). Od tej chwili pakiety wysłane na dany adres multicast będą przesyłane również do komputera, który zarejestrował się w do danej grupy.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Komunikacja UDP w Javie ==&lt;br /&gt;
== Unicast/Broadcast ==&lt;br /&gt;
=== Klasa konfiguracyjna ===&lt;br /&gt;
 import java.net.InetAddress;&lt;br /&gt;
 import java.net.UnknownHostException;&lt;br /&gt;
 &lt;br /&gt;
 public class Config {&lt;br /&gt;
     public static final int PORT = 9000;&lt;br /&gt;
     public static final int BUFFER_SIZE = 1024;&lt;br /&gt;
     public static final InetAddress MULTICAST_ADDRESS;&lt;br /&gt;
     public static final int MULTICAST_PORT = 9000;&lt;br /&gt;
     static {&lt;br /&gt;
         try{&lt;br /&gt;
             MULTICAST_ADDRESS = InetAddress.getByName(&amp;quot;239.255.42.99&amp;quot;);&lt;br /&gt;
         }catch (UnknownHostException e){&lt;br /&gt;
             throw new RuntimeException(e);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Serwer ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 import java.net.DatagramPacket;&lt;br /&gt;
 import java.net.DatagramSocket;&lt;br /&gt;
 import java.net.InetAddress;&lt;br /&gt;
 &lt;br /&gt;
 public class UDPServer {&lt;br /&gt;
 &lt;br /&gt;
     public static void main(String[] args) throws Exception{&lt;br /&gt;
 &lt;br /&gt;
         //Otwarcie gniazda z okreslonym portem&lt;br /&gt;
         DatagramSocket datagramSocket = new DatagramSocket(Config.PORT);&lt;br /&gt;
 &lt;br /&gt;
         byte[] byteResponse = &amp;quot;OK&amp;quot;.getBytes(&amp;quot;utf8&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         while (true){&lt;br /&gt;
 &lt;br /&gt;
             DatagramPacket receivedPacket&lt;br /&gt;
                     = new DatagramPacket( new byte[Config.BUFFER_SIZE], Config.BUFFER_SIZE);&lt;br /&gt;
 &lt;br /&gt;
             datagramSocket.receive(receivedPacket);&lt;br /&gt;
 &lt;br /&gt;
             int length = receivedPacket.getLength();&lt;br /&gt;
             String message =&lt;br /&gt;
                     new String(receivedPacket.getData(), 0, length, &amp;quot;utf8&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
             // Port i host który wysłał nam zapytanie&lt;br /&gt;
             InetAddress address = receivedPacket.getAddress();&lt;br /&gt;
             int port = receivedPacket.getPort();&lt;br /&gt;
 &lt;br /&gt;
             System.out.println(message);&lt;br /&gt;
             Thread.sleep(1000); //To oczekiwanie nie jest potrzebne dla&lt;br /&gt;
             // obsługi gniazda&lt;br /&gt;
 &lt;br /&gt;
             DatagramPacket response&lt;br /&gt;
                     = new DatagramPacket(&lt;br /&gt;
                         byteResponse, byteResponse.length, address, port);&lt;br /&gt;
 &lt;br /&gt;
             datagramSocket.send(response);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Ważniejsze miejsca programu ===&lt;br /&gt;
Przygotowanie do odbierania połączeń UDP na zadanym portcie:&lt;br /&gt;
&lt;br /&gt;
 DatagramSocket datagramSocket = new DatagramSocket(9000);&lt;br /&gt;
&lt;br /&gt;
Stworzenie pakietu który będzie odbierał dane:&lt;br /&gt;
&lt;br /&gt;
 DatagramPacket receivedPacket&lt;br /&gt;
              = new DatagramPacket( new byte[BUFFER_SIZE], BUFFER_SIZE);&lt;br /&gt;
&lt;br /&gt;
Odebranie pakietu:&lt;br /&gt;
&lt;br /&gt;
 datagramSocket.receive(receivedPacket);&lt;br /&gt;
&lt;br /&gt;
Tutaj jest kolejny detal implementacyjny w Javie: musimy przekształcić ciąg bajtów do instancji klasy string. Zakładamy że dane w pakiecie kodowane są za pomocą utf-8.&lt;br /&gt;
&lt;br /&gt;
 int length = receivedPacket.getLength();&lt;br /&gt;
 String message =&lt;br /&gt;
     new String(receivedPacket.getData(), 0, length, &amp;quot;utf8&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Wysłanie odpowiedzi:&lt;br /&gt;
&lt;br /&gt;
 byte[] byteResponse = &amp;quot;OK&amp;quot;.getBytes(&amp;quot;utf8&amp;quot;);&lt;br /&gt;
 DatagramPacket response&lt;br /&gt;
                  = new DatagramPacket(&lt;br /&gt;
                      byteResponse, byteResponse.length, address, port);&lt;br /&gt;
&lt;br /&gt;
=== Klient === &lt;br /&gt;
&lt;br /&gt;
 import java.io.IOException;&lt;br /&gt;
 import java.net.DatagramPacket;&lt;br /&gt;
 import java.net.DatagramSocket;&lt;br /&gt;
 import java.net.InetAddress;&lt;br /&gt;
 import java.net.SocketTimeoutException;&lt;br /&gt;
 &lt;br /&gt;
 public class UDPClient {&lt;br /&gt;
 &lt;br /&gt;
     public static void main(String[] args) throws IOException {&lt;br /&gt;
  &lt;br /&gt;
         String message = &amp;quot;tekst&amp;quot;;&lt;br /&gt;
         InetAddress serverAddress = InetAddress.getByName(&amp;quot;localhost&amp;quot;);&lt;br /&gt;
         System.out.println(serverAddress);&lt;br /&gt;
 &lt;br /&gt;
         DatagramSocket socket = new DatagramSocket(); //Otwarcie gniazda&lt;br /&gt;
         byte[] stringContents = message.getBytes(&amp;quot;utf8&amp;quot;); //Pobranie strumienia bajtów z wiadomosci&lt;br /&gt;
 &lt;br /&gt;
         DatagramPacket sentPacket = new DatagramPacket(stringContents, stringContents.length);&lt;br /&gt;
         sentPacket.setAddress(serverAddress);&lt;br /&gt;
         sentPacket.setPort(Config.PORT);&lt;br /&gt;
         socket.send(sentPacket);&lt;br /&gt;
 &lt;br /&gt;
         DatagramPacket recievePacket = new DatagramPacket( new byte[Config.BUFFER_SIZE], Config.BUFFER_SIZE);&lt;br /&gt;
         socket.setSoTimeout(1010);&lt;br /&gt;
 &lt;br /&gt;
         try{&lt;br /&gt;
             socket.receive(recievePacket);&lt;br /&gt;
             System.out.println(&amp;quot;Serwer otrzymał wiadomość&amp;quot;);&lt;br /&gt;
         }catch (SocketTimeoutException ste){&lt;br /&gt;
             System.out.println(&amp;quot;Serwer nie odpowiedział, więc albo dostał wiadomość albo nie...&amp;quot;);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Ważniejsze miejsca w programie ===&lt;br /&gt;
Wybieramy do jakiego adresu wysyłamy informacje:&lt;br /&gt;
&lt;br /&gt;
 InetAddress serverAddress = InetAddress.getByName(&amp;quot;localhost&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Wysłanie pakietu:&lt;br /&gt;
&lt;br /&gt;
 byte[] stringContents = message.getBytes(&amp;quot;utf8&amp;quot;); //Pobranie strumienia bajtów z wiadomosci&lt;br /&gt;
 &lt;br /&gt;
 DatagramPacket sentPacket = new DatagramPacket(stringContents, stringContents.length);&lt;br /&gt;
 sentPacket.setAddress(serverAddress);&lt;br /&gt;
 sentPacket.setPort(PORT);&lt;br /&gt;
&lt;br /&gt;
Odebranie odpowiedzi.&lt;br /&gt;
&lt;br /&gt;
Tutaj musimy się na chwilę zatrzymać: w TCP moglibyśmy po prostu poczekać na odpowiedź od serwera, tutaj nie możemy tak zrobić - przecież odpowiedź od serwera może po prostu nie nadejść... należy więc powiedzieć socketowi: poczekaj określony czas na odpowiedż, jeśli nie nadejdzie ona zgłoś wyjątek.&lt;br /&gt;
&lt;br /&gt;
Ustawienie okresu oczekiwania na odpowiedź:&lt;br /&gt;
&lt;br /&gt;
'''Uwaga:''' Argument metody &amp;lt;code&amp;gt;setSoTimeout&amp;lt;/code&amp;gt; to maksymalny czas oczekiwania na odpowiedź w milisekundach.&lt;br /&gt;
&lt;br /&gt;
 socket.setSoTimeout(1010);&lt;br /&gt;
&lt;br /&gt;
Odebranie danych:&lt;br /&gt;
&lt;br /&gt;
 DatagramPacket receivedPacket = new DatagramPacket(new byte[Config.BUFFER_SIZE], Config.BUFFER_SIZE);&lt;br /&gt;
 try{&lt;br /&gt;
     socket.receive(receivedPacket);&lt;br /&gt;
     System.out.println(&amp;quot;Serwer otrzymał wiadomość&amp;quot;);&lt;br /&gt;
 }catch (SocketTimeoutException ste){&lt;br /&gt;
     System.out.println(&amp;quot;Serwer nie odpowiedział, więc albo dostał wiadomość albo nie...&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== Zadanie 1 ===&lt;br /&gt;
(Unicast) W parach modyfikujemy powyższe przykłady:&lt;br /&gt;
&lt;br /&gt;
Klient:&lt;br /&gt;
* Klient po uruchomieniu wysyła “Imię Nazwisko” (np. “Adam Szczurek”) użytkownika do serwera. Następnie odbiera potwierdzenie otrzymania wiadomości z serwera.&lt;br /&gt;
* Dalej klient pyta użytkownika, czy chce poznać nazwiska innych, którzy łączyli się do serwera (y/n).&lt;br /&gt;
** Jeśli tak, to wysyła &amp;quot;y&amp;quot; do serwera, a następnie pobiera od niego pakiet z odpowiedzią i wyświetla ją na ekranie.&lt;br /&gt;
** Jeśli nie, to kończy działanie.&lt;br /&gt;
&lt;br /&gt;
Serwer:&lt;br /&gt;
* Serwer w pętli przyjmuje pakiety przychodzące.&lt;br /&gt;
**Jeśli przychodząca wiadomość nie jest równa y (!message.equals(&amp;quot;y&amp;quot;)), to  dodaje kolejnych użytkowników do tablicy: ArrayList&amp;lt;String&amp;gt; clients = new ArrayList&amp;lt;String&amp;gt;(); i przesyła do klienta tekst “Dodano klienta o nazwie: &amp;lt;nazwa&amp;gt;”.&lt;br /&gt;
** Jeśli serwer otrzyma “y”, to przesyła do klienta zawartość tablicy clients.&lt;br /&gt;
&lt;br /&gt;
=== Zadanie 2 ===&lt;br /&gt;
(Broadcast) Tworzymy program, który pozwala na sprawdzenie listy obecności na zajęciach (widocznej dla każdego użytkownika sieci).&lt;br /&gt;
&lt;br /&gt;
W parach tworzymy jeden program, który wysyła i odbiera dane jednocześnie (2 wątki):&lt;br /&gt;
* Pierwszy wątek (odbierający): w pętli nasłuchuje na wybranym porcie (np. 9111) i jeśli coś otrzyma to wyświetla na ekran w formacie &amp;lt;Wiadomosc&amp;gt; &amp;lt;IP&amp;gt; &amp;lt;PORT&amp;gt;.&lt;br /&gt;
* Drugi wątek (wysyłający): w pętli co 1 s wysyła na adres Broadcast pakiet z informacją o loginie (tekst &amp;lt;Imie&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==Multicast ==&lt;br /&gt;
=== Serwer ===&lt;br /&gt;
 import java.net.DatagramPacket;&lt;br /&gt;
 import java.net.DatagramSocket;&lt;br /&gt;
 import java.net.InetAddress;&lt;br /&gt;
 import java.net.MulticastSocket;&lt;br /&gt;
 &lt;br /&gt;
 public class MulticastServer {&lt;br /&gt;
     public static void main(String[] args) throws Exception{&lt;br /&gt;
 &lt;br /&gt;
         byte[] responseBytes = &amp;quot;ACK&amp;quot;.getBytes();&lt;br /&gt;
 &lt;br /&gt;
         InetAddress group = Config.MULTICAST_ADDRESS;&lt;br /&gt;
         MulticastSocket s = new MulticastSocket(Config.MULTICAST_PORT);&lt;br /&gt;
         s.joinGroup(group);&lt;br /&gt;
 &lt;br /&gt;
         try{&lt;br /&gt;
             while (true){&lt;br /&gt;
                 DatagramPacket recv = new DatagramPacket(new byte[Config.BUFFER_SIZE], Config.BUFFER_SIZE);&lt;br /&gt;
                 s.receive(recv);&lt;br /&gt;
                 String stringMsg = new String(recv.getData(), 0, recv.getLength(), &amp;quot;utf8&amp;quot;);&lt;br /&gt;
                 System.err.println(&amp;quot;Got message: \&amp;quot;&amp;quot; + stringMsg + &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
                 DatagramSocket responseSocket = new DatagramSocket();&lt;br /&gt;
                 DatagramPacket response = new DatagramPacket(responseBytes, responseBytes.length);&lt;br /&gt;
                 response.setAddress(recv.getAddress());&lt;br /&gt;
                 response.setPort(recv.getPort());&lt;br /&gt;
                 Thread.sleep(1000); // Ta linijka powoduje wstrzymanie wysyłania odpowiedzi przez&lt;br /&gt;
                 // jedną sekundę --- nie ma ona związku z obsługą UDP.&lt;br /&gt;
                 responseSocket.send(response);&lt;br /&gt;
             }&lt;br /&gt;
         }finally {&lt;br /&gt;
             s.leaveGroup(group);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ważniejsze miejsca programu ===&lt;br /&gt;
&lt;br /&gt;
Stworzenie gniazda multicast - oraz dołączenie do grupy mulitcast&lt;br /&gt;
&lt;br /&gt;
 InetAddress group = Config.MULTICAST_ADDRESS; &lt;br /&gt;
 MulticastSocket s = new MulticastSocket(Config.MULTICAST_PORT);&lt;br /&gt;
 s.joinGroup(group);&lt;br /&gt;
&lt;br /&gt;
=== Klient ===&lt;br /&gt;
 import java.net.DatagramPacket;&lt;br /&gt;
 import java.net.DatagramSocket;&lt;br /&gt;
 import java.net.SocketTimeoutException;&lt;br /&gt;
 &lt;br /&gt;
 public class MulticastClient {&lt;br /&gt;
 &lt;br /&gt;
 public static void main(String[] args) throws Exception{&lt;br /&gt;
        DatagramSocket s = new DatagramSocket();&lt;br /&gt;
 &lt;br /&gt;
        byte[] message = &amp;quot;Test&amp;quot;.getBytes(&amp;quot;utf8&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
        DatagramPacket packet = new DatagramPacket(message, message.length);&lt;br /&gt;
        packet.setPort(Config.PORT);&lt;br /&gt;
        packet.setAddress(Config.MULTICAST_ADDRESS);&lt;br /&gt;
        s.send(packet);&lt;br /&gt;
 &lt;br /&gt;
        System.out.println(&amp;quot;Wysłałem pakiet&amp;quot;);&lt;br /&gt;
        s.setSoTimeout(1000);&lt;br /&gt;
        DatagramPacket response = new DatagramPacket(new byte[Config.BUFFER_SIZE], Config.BUFFER_SIZE);&lt;br /&gt;
        try{&lt;br /&gt;
            s.receive(response);&lt;br /&gt;
            System.out.println(&amp;quot;Odpowiedź: &amp;quot;);&lt;br /&gt;
            System.out.print(new String(response.getData(), 0,  response.getLength(), &amp;quot;utf8&amp;quot;));&lt;br /&gt;
        }catch (SocketTimeoutException e){&lt;br /&gt;
            System.out.println(&amp;quot;Nie otrzymałem odpowiedzi&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Ważniejsze miejsca programu ===&lt;br /&gt;
&lt;br /&gt;
Wysłanie pakietu na grupę multicast:&lt;br /&gt;
&lt;br /&gt;
 DatagramPacket packet = new DatagramPacket(message, message.length);&lt;br /&gt;
 packet.setPort(Config.PORT);&lt;br /&gt;
 packet.setAddress(Config.MULTICAST_ADDRESS);&lt;br /&gt;
 s.send(packet);&lt;br /&gt;
&lt;br /&gt;
Ustawienie timeoutu na odowiedź:&lt;br /&gt;
&lt;br /&gt;
 s.setSoTimeout(1000);&lt;br /&gt;
&lt;br /&gt;
=== Zadanie 3 ===&lt;br /&gt;
(Multicast) Przerabiamy program z Zadania 2, aby działał na multicast.&lt;br /&gt;
&lt;br /&gt;
== Projekt nr 2 ==&lt;br /&gt;
Wybieramy ('''w parach''') projekty z listy: http://www.if.pw.edu.pl/~lgraczyk/sk/html/pd2.html&lt;/div&gt;</summary>
		<author><name>Lgraczyk</name></author>	</entry>

	</feed>