<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://mit.spbau.ru/sewiki/index.php?action=history&amp;feed=atom&amp;title=Java_Network</id>
		<title>Java Network - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://mit.spbau.ru/sewiki/index.php?action=history&amp;feed=atom&amp;title=Java_Network"/>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_Network&amp;action=history"/>
		<updated>2026-04-17T00:08:17Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_Network&amp;diff=1332&amp;oldid=prev</id>
		<title>Antonk: /* Что почитать */</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_Network&amp;diff=1332&amp;oldid=prev"/>
				<updated>2012-04-18T07:27:26Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Что почитать&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&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 style='vertical-align: top;' lang='ru'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 07:27, 18 апреля 2012&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l2&quot; &gt;Строка 2:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 2:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[http://javatutor.net/books/tiej/socket Thinking In Java Enterprise (русский перевод) → Сетевое программирование с Сокетами и Каналами]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[http://javatutor.net/books/tiej/socket Thinking In Java Enterprise (русский перевод) → Сетевое программирование с Сокетами и Каналами]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[http://www.javaportal.ru/java/articles/useselectfast.html Использование select для высокоскоростного сетевого взаимодействия]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[http://www.javaportal.ru/java/articles/useselectfast.html Использование select для высокоскоростного сетевого взаимодействия]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Antonk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_Network&amp;diff=1331&amp;oldid=prev</id>
		<title>Antonk в 07:27, 18 апреля 2012</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_Network&amp;diff=1331&amp;oldid=prev"/>
				<updated>2012-04-18T07:27:07Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&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 style='vertical-align: top;' lang='ru'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 07:27, 18 апреля 2012&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;Строка 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;== Что почитать ==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[http://javatutor.net/books/tiej/socket Thinking In Java Enterprise (русский перевод) → Сетевое программирование с Сокетами и Каналами]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[http://www.javaportal.ru/java/articles/useselectfast.html Использование select для высокоскоростного сетевого взаимодействия]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 1. WhoAmI ==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== 1. WhoAmI ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Antonk</name></author>	</entry>

	<entry>
		<id>http://mit.spbau.ru/sewiki/index.php?title=Java_Network&amp;diff=1329&amp;oldid=prev</id>
		<title>Antonk: Новая страница: «== 1. WhoAmI ==  &lt;source lang=&quot;java&quot;&gt; import java.net.InetAddress; import java.net.UnknownHostException;  public class WhoAmI { 	public static void main(String[] arg…»</title>
		<link rel="alternate" type="text/html" href="http://mit.spbau.ru/sewiki/index.php?title=Java_Network&amp;diff=1329&amp;oldid=prev"/>
				<updated>2012-04-18T07:22:30Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «== 1. WhoAmI ==  &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt; import java.net.InetAddress; import java.net.UnknownHostException;  public class WhoAmI { 	public static void main(String[] arg…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 1. WhoAmI ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.net.InetAddress;&lt;br /&gt;
import java.net.UnknownHostException;&lt;br /&gt;
&lt;br /&gt;
public class WhoAmI {&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
        if (args.length != 1) {&lt;br /&gt;
            System.err.println(&amp;quot;Usage: WhoAmI MachineName&amp;quot;);&lt;br /&gt;
            System.exit(1);&lt;br /&gt;
        }&lt;br /&gt;
		try {&lt;br /&gt;
	        InetAddress a = InetAddress.getByName(args[0]);&lt;br /&gt;
	        InetAddress b = InetAddress.getByName(null);&lt;br /&gt;
	        InetAddress c = InetAddress.getByName(&amp;quot;localhost&amp;quot;);&lt;br /&gt;
	        InetAddress d = InetAddress.getByName(&amp;quot;127.0.0.1&amp;quot;);	        &lt;br /&gt;
		    System.out.println(a);			&lt;br /&gt;
		    System.out.println(b + &amp;quot; &amp;quot; + c + &amp;quot; &amp;quot; + d);			&lt;br /&gt;
		} catch (UnknownHostException e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. EchoClient ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.BufferedWriter;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.io.OutputStreamWriter;&lt;br /&gt;
import java.io.PrintWriter;&lt;br /&gt;
import java.net.InetAddress;&lt;br /&gt;
import java.net.Socket;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class EchoClient {&lt;br /&gt;
	   public static void main(String[] args) throws IOException {&lt;br /&gt;
		      InetAddress addr = InetAddress.getByName(null);&lt;br /&gt;
		      System.out.println(&amp;quot;addr = &amp;quot; + addr);&lt;br /&gt;
		      Socket socket = new Socket(addr, EchoServer.PORT);&lt;br /&gt;
		      // Помещаем все в блок try-finally, чтобы&lt;br /&gt;
		      // быть уверенным, что сокет закроется:&lt;br /&gt;
		      try {&lt;br /&gt;
		         System.out.println(&amp;quot;socket = &amp;quot; + socket);&lt;br /&gt;
		         BufferedReader in = new BufferedReader(new InputStreamReader(socket&lt;br /&gt;
		               .getInputStream()));&lt;br /&gt;
		         // Вывод автоматически Output быталкивается PrintWriter'ом.&lt;br /&gt;
		         PrintWriter out = new PrintWriter(new BufferedWriter(&lt;br /&gt;
		               new OutputStreamWriter(socket.getOutputStream())), true);&lt;br /&gt;
		         for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
		            out.println(&amp;quot;howdy &amp;quot; + i);&lt;br /&gt;
		            String str = in.readLine();&lt;br /&gt;
		            System.out.println(str);&lt;br /&gt;
		         }&lt;br /&gt;
		         out.println(&amp;quot;END&amp;quot;);&lt;br /&gt;
		      }&lt;br /&gt;
		      finally {&lt;br /&gt;
		         System.out.println(&amp;quot;closing...&amp;quot;);&lt;br /&gt;
		         socket.close();&lt;br /&gt;
		      }&lt;br /&gt;
		   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. EchoServer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.BufferedWriter;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.io.OutputStreamWriter;&lt;br /&gt;
import java.io.PrintWriter;&lt;br /&gt;
import java.net.ServerSocket;&lt;br /&gt;
import java.net.Socket;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class EchoServer {&lt;br /&gt;
	   // Выбираем порт вне пределов 1-1024:&lt;br /&gt;
	   public static final int PORT = 8080;&lt;br /&gt;
	  &lt;br /&gt;
	   public static void main(String[] args) throws IOException {&lt;br /&gt;
	      ServerSocket s = new ServerSocket(PORT);&lt;br /&gt;
	      System.out.println(&amp;quot;Started: &amp;quot; + s);&lt;br /&gt;
	      try {&lt;br /&gt;
	         // Блокирует до тех пор, пока не возникнет соединение:&lt;br /&gt;
	         Socket socket = s.accept();&lt;br /&gt;
	         try {&lt;br /&gt;
	            System.out.println(&amp;quot;Connection accepted: &amp;quot; + socket);&lt;br /&gt;
	            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));&lt;br /&gt;
	            &lt;br /&gt;
	            // Вывод автоматически выталкивается из буфера PrintWriter'ом&lt;br /&gt;
	            PrintWriter out = new PrintWriter(new BufferedWriter(&lt;br /&gt;
	                  new OutputStreamWriter(socket.getOutputStream())), true);&lt;br /&gt;
	            while (true) {&lt;br /&gt;
	               String str = in.readLine();&lt;br /&gt;
	               if (str.equals(&amp;quot;END&amp;quot;))&lt;br /&gt;
	                  break;&lt;br /&gt;
	               System.out.println(&amp;quot;Echoing: &amp;quot; + str);&lt;br /&gt;
	               out.println(str);&lt;br /&gt;
	            }&lt;br /&gt;
	            // Всегда закрываем два сокета...&lt;br /&gt;
	         }&lt;br /&gt;
	         finally {&lt;br /&gt;
	            System.out.println(&amp;quot;closing...&amp;quot;);&lt;br /&gt;
	            socket.close();&lt;br /&gt;
	         }&lt;br /&gt;
	      }&lt;br /&gt;
	      finally {&lt;br /&gt;
	         s.close();&lt;br /&gt;
	      }&lt;br /&gt;
	   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. MultiEchoServer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.BufferedWriter;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.io.OutputStreamWriter;&lt;br /&gt;
import java.io.PrintWriter;&lt;br /&gt;
import java.net.ServerSocket;&lt;br /&gt;
import java.net.Socket;&lt;br /&gt;
&lt;br /&gt;
class OneEchoServer extends Thread {&lt;br /&gt;
   private Socket socket;&lt;br /&gt;
   private BufferedReader in;&lt;br /&gt;
   private PrintWriter out;&lt;br /&gt;
  &lt;br /&gt;
   public OneEchoServer(Socket s) throws IOException {&lt;br /&gt;
      socket = s;&lt;br /&gt;
      in = new BufferedReader(new InputStreamReader(socket.getInputStream()));&lt;br /&gt;
      // Включаем автоматическое выталкивание:&lt;br /&gt;
      out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);&lt;br /&gt;
      // Если любой из вышеприведенных вызовов приведет к&lt;br /&gt;
      // возникновению исключения, то вызывающий отвечает за&lt;br /&gt;
      // закрытие сокета. В противном случае, нить&lt;br /&gt;
      // закроет его.&lt;br /&gt;
      start(); // вызываем run()&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   public void run() {&lt;br /&gt;
      try {&lt;br /&gt;
         while (true) {&lt;br /&gt;
            String str = in.readLine();&lt;br /&gt;
            if (str.equals(&amp;quot;END&amp;quot;))&lt;br /&gt;
               break;&lt;br /&gt;
            System.out.println(&amp;quot;Echoing: &amp;quot; + str);&lt;br /&gt;
            out.println(str);&lt;br /&gt;
         }&lt;br /&gt;
         System.out.println(&amp;quot;closing...&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      catch (IOException e) {&lt;br /&gt;
         System.err.println(&amp;quot;IO Exception&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      finally {&lt;br /&gt;
         try {&lt;br /&gt;
            socket.close();&lt;br /&gt;
         }&lt;br /&gt;
         catch (IOException e) {&lt;br /&gt;
            System.err.println(&amp;quot;Socket not closed&amp;quot;);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class MultiEchoServer {&lt;br /&gt;
   static final int PORT = 8080;&lt;br /&gt;
  &lt;br /&gt;
   public static void main(String[] args) throws IOException {&lt;br /&gt;
      ServerSocket s = new ServerSocket(PORT);&lt;br /&gt;
      System.out.println(&amp;quot;Server Started&amp;quot;);&lt;br /&gt;
      try {&lt;br /&gt;
         while (true) {&lt;br /&gt;
            // Блокируется до возникновения нового соединения:&lt;br /&gt;
            Socket socket = s.accept();&lt;br /&gt;
            try {&lt;br /&gt;
               new OneEchoServer(socket);&lt;br /&gt;
            }&lt;br /&gt;
            catch (IOException e) {&lt;br /&gt;
               // Если завершится неудачей, закрывается сокет,&lt;br /&gt;
               // в противном случае, нить закроет его:&lt;br /&gt;
               socket.close();&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
      finally {&lt;br /&gt;
         s.close();&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
} // /:~&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 5. MultiEchoClient ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.BufferedReader;&lt;br /&gt;
import java.io.BufferedWriter;&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.InputStreamReader;&lt;br /&gt;
import java.io.OutputStreamWriter;&lt;br /&gt;
import java.io.PrintWriter;&lt;br /&gt;
import java.net.InetAddress;&lt;br /&gt;
import java.net.Socket;&lt;br /&gt;
&lt;br /&gt;
class EchoClientThread extends Thread {&lt;br /&gt;
   private Socket socket;&lt;br /&gt;
   private BufferedReader in;&lt;br /&gt;
   private PrintWriter out;&lt;br /&gt;
   private static int counter = 0;&lt;br /&gt;
   private int id = counter++;&lt;br /&gt;
   private static int threadcount = 0;&lt;br /&gt;
  &lt;br /&gt;
   public static int threadCount() {&lt;br /&gt;
      return threadcount;&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   public EchoClientThread(InetAddress addr) {&lt;br /&gt;
      System.out.println(&amp;quot;Making client &amp;quot; + id);&lt;br /&gt;
      threadcount++;&lt;br /&gt;
      try {&lt;br /&gt;
         socket = new Socket(addr, MultiEchoServer.PORT);&lt;br /&gt;
      }&lt;br /&gt;
      catch (IOException e) {&lt;br /&gt;
         System.err.println(&amp;quot;Socket failed&amp;quot;);&lt;br /&gt;
         // Если создание сокета провалилось,&lt;br /&gt;
         // ничего ненужно чистить.&lt;br /&gt;
      }&lt;br /&gt;
      try {&lt;br /&gt;
         in = new BufferedReader(new InputStreamReader(socket&lt;br /&gt;
               .getInputStream()));&lt;br /&gt;
         // Включаем автоматическое выталкивание:&lt;br /&gt;
         out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);&lt;br /&gt;
         start();&lt;br /&gt;
      }&lt;br /&gt;
      catch (IOException e) {&lt;br /&gt;
         // Сокет должен быть закрыт при любой&lt;br /&gt;
         // ошибке, кроме ошибки конструктора сокета:&lt;br /&gt;
         try {&lt;br /&gt;
            socket.close();&lt;br /&gt;
         }&lt;br /&gt;
         catch (IOException e2) {&lt;br /&gt;
            System.err.println(&amp;quot;Socket not closed&amp;quot;);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
      // В противном случае сокет будет закрыт&lt;br /&gt;
      // в методе run() нити.&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   public void run() {&lt;br /&gt;
      try {&lt;br /&gt;
         for (int i = 0; i &amp;lt; 25; i++) {&lt;br /&gt;
            out.println(&amp;quot;Client &amp;quot; + id + &amp;quot;: &amp;quot; + i);&lt;br /&gt;
            try {&lt;br /&gt;
				Thread.sleep(100);&lt;br /&gt;
			} catch (InterruptedException e) {&lt;br /&gt;
				e.printStackTrace();&lt;br /&gt;
			}&lt;br /&gt;
            String str = in.readLine();&lt;br /&gt;
            System.out.println(str);&lt;br /&gt;
         }&lt;br /&gt;
         out.println(&amp;quot;END&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      catch (IOException e) {&lt;br /&gt;
         System.err.println(&amp;quot;IO Exception&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      finally {&lt;br /&gt;
         // Всегда закрывает:&lt;br /&gt;
         try {&lt;br /&gt;
            socket.close();&lt;br /&gt;
         }&lt;br /&gt;
         catch (IOException e) {&lt;br /&gt;
            System.err.println(&amp;quot;Socket not closed&amp;quot;);&lt;br /&gt;
         }&lt;br /&gt;
         threadcount--; // Завершаем эту нить&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class MultiEchoClient {&lt;br /&gt;
   static final int MAX_THREADS = 40;&lt;br /&gt;
  &lt;br /&gt;
   public static void main(String[] args) throws IOException,&lt;br /&gt;
         InterruptedException {&lt;br /&gt;
      InetAddress addr = InetAddress.getByName(null);&lt;br /&gt;
      while (true) {&lt;br /&gt;
         if (EchoClientThread.threadCount() &amp;lt; MAX_THREADS) {&lt;br /&gt;
            new EchoClientThread(addr);&lt;br /&gt;
         }&lt;br /&gt;
         Thread.sleep(100);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
} // /:~&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 6. UDPEchoClient ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.net.*; &lt;br /&gt;
&lt;br /&gt;
import java.io.*;&lt;br /&gt;
&lt;br /&gt;
public class UDPEchoCLient{&lt;br /&gt;
	private InetAddress addr;&lt;br /&gt;
	private int port;&lt;br /&gt;
	private DatagramSocket ds;&lt;br /&gt;
	&lt;br /&gt;
	UDPEchoCLient(String host, int port) throws UnknownHostException, SocketException{ &lt;br /&gt;
		this.addr = InetAddress.getByName(host);&lt;br /&gt;
		this.port = port; &lt;br /&gt;
		this.ds = new DatagramSocket(); &lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public void sendMessage(String mes){ &lt;br /&gt;
		try{&lt;br /&gt;
			byte[] data = mes.getBytes();&lt;br /&gt;
			DatagramPacket pack = new DatagramPacket(data, data.length, addr, port); &lt;br /&gt;
			ds.send(pack); &lt;br /&gt;
		} catch(IOException e){&lt;br /&gt;
			System.err.println(e); &lt;br /&gt;
&lt;br /&gt;
		} &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	public void close() {&lt;br /&gt;
		ds.close();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
		try {&lt;br /&gt;
			UDPEchoCLient sndr = new UDPEchoCLient(&amp;quot;localhost&amp;quot;, 1050);&lt;br /&gt;
			for (String mes : args)&lt;br /&gt;
				sndr.sendMessage(mes);&lt;br /&gt;
			sndr.close();&lt;br /&gt;
		} catch (UnknownHostException | SocketException e) {&lt;br /&gt;
			e.printStackTrace();&lt;br /&gt;
		} &lt;br /&gt;
	} &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. UDPEchoServer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.net.DatagramPacket;&lt;br /&gt;
import java.net.DatagramSocket;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public class UDPEchoServer {&lt;br /&gt;
	public static void main(String[] args) {&lt;br /&gt;
		try {&lt;br /&gt;
			DatagramSocket ds = new DatagramSocket(1050); &lt;br /&gt;
&lt;br /&gt;
			while (true){&lt;br /&gt;
				DatagramPacket pack = new DatagramPacket(new byte[1024], 1024);&lt;br /&gt;
				ds.receive(pack);&lt;br /&gt;
				System.out.println(new String(pack.getData())); &lt;br /&gt;
			} &lt;br /&gt;
		} catch (Exception e) {&lt;br /&gt;
			System.out.println(e); &lt;br /&gt;
		}  &lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. NonBlockingIO ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.net.*;&lt;br /&gt;
import java.nio.channels.*;&lt;br /&gt;
import java.util.*;&lt;br /&gt;
import java.io.*;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* Цель: Показать как использовать селектор. Нет чтения/записи, просто&lt;br /&gt;
* показывается готовность к совершению операции.&lt;br /&gt;
*&lt;br /&gt;
* Алгоритм: -&amp;gt; Создаем селектор. -&amp;gt; Создаем канал -&amp;gt; Связываем сокет,&lt;br /&gt;
* ассоциированный с каналом, с &amp;lt;клиентским портом&amp;gt; -&amp;gt; Конфигурируем канал, как&lt;br /&gt;
* не блокирующий -&amp;gt; Регестрируем канал в селекторе. -&amp;gt; Вызываем метод select( ),&lt;br /&gt;
* чтобы он блокировал выполнение до тех пор, пока канал не будет готов. (как&lt;br /&gt;
* это предполагается методом select(long timeout) -&amp;gt; Получаем множество ключей,&lt;br /&gt;
* относящихся к готовому каналу для работы, основной интерес состоит в том,&lt;br /&gt;
* когда они зарегестрированя с помощью селектора. -&amp;gt; Перебираем ключи. -&amp;gt; Для&lt;br /&gt;
* каждого ключа проверяем, что соответствующий канал готов к работе, в которой&lt;br /&gt;
* он заинтересован. -&amp;gt; Если он готов, печатаем сообщение о готовности.&lt;br /&gt;
*&lt;br /&gt;
* Примечание: -&amp;gt; Необходим запущенный MultiJabberServer на локальной машине. Вы&lt;br /&gt;
* запускаете его и соединяетесь с локальным MultiJabberServer -&amp;gt; Он может стать&lt;br /&gt;
* причиной исключения в MultiJabberServer, но это исключение ожидаемо.&lt;br /&gt;
*/&lt;br /&gt;
public class NonBlockingIO {&lt;br /&gt;
   public static void main(String[] args) throws IOException {&lt;br /&gt;
      if (args.length &amp;lt; 2) {&lt;br /&gt;
         System.out.println(&amp;quot;Usage: java &amp;lt;client port&amp;gt; &amp;lt;local server port&amp;gt;&amp;quot;);&lt;br /&gt;
         System.exit(1);&lt;br /&gt;
      }&lt;br /&gt;
      int cPort = Integer.parseInt(args[0]);&lt;br /&gt;
      int sPort = Integer.parseInt(args[1]);&lt;br /&gt;
      SocketChannel ch = SocketChannel.open();&lt;br /&gt;
      Selector sel = Selector.open();&lt;br /&gt;
      try {&lt;br /&gt;
         ch.socket().bind(new InetSocketAddress(cPort));&lt;br /&gt;
         ch.configureBlocking(false);&lt;br /&gt;
         // Канал заинтересован в выполнении чтения/записи/соединении&lt;br /&gt;
         ch.register(sel, SelectionKey.OP_READ | SelectionKey.OP_WRITE&lt;br /&gt;
               | SelectionKey.OP_CONNECT);&lt;br /&gt;
         // Разблокируем, когда готовы к чтению/записи/соединению&lt;br /&gt;
         sel.select();&lt;br /&gt;
         // Ключи, относящиеся к готовому каналу, канал заинтересован&lt;br /&gt;
         // в работе, которая может быть выполненаin can be&lt;br /&gt;
         // без блокирования.&lt;br /&gt;
         Iterator&amp;lt;?&amp;gt; it = sel.selectedKeys().iterator();&lt;br /&gt;
         while (it.hasNext()) {&lt;br /&gt;
            SelectionKey key = (SelectionKey) it.next();&lt;br /&gt;
            it.remove();&lt;br /&gt;
            // Если связанный с ключом канал готов к соединению?&lt;br /&gt;
            // if((key.readyOps() &amp;amp; SelectionKey.OP_CONNECT) != 0) {&lt;br /&gt;
            if (key.isConnectable()) {&lt;br /&gt;
               InetAddress ad = InetAddress.getLocalHost();&lt;br /&gt;
               System.out.println(&amp;quot;Connect will not block&amp;quot;);&lt;br /&gt;
               // Вы должны проверить возвращаемое значение,&lt;br /&gt;
               // чтобы убедиться, что он соединен. Этот не блокированный&lt;br /&gt;
               // вызов может вернуться без соединения, когда&lt;br /&gt;
               // нет сервера, к которому вы пробуете подключиться&lt;br /&gt;
               // Поэтому вы вызываете finishConnect(), который завершает&lt;br /&gt;
               // операцию соединения.&lt;br /&gt;
               if (!ch.connect(new InetSocketAddress(ad, sPort)))&lt;br /&gt;
                  ch.finishConnect();&lt;br /&gt;
            }&lt;br /&gt;
            // Если канал, связанный с ключом, готов к чтению?&lt;br /&gt;
            // if((key.readyOps() &amp;amp; SelectionKey.OP_READ) != 0)&lt;br /&gt;
            if (key.isReadable())&lt;br /&gt;
               System.out.println(&amp;quot;Read will not block&amp;quot;);&lt;br /&gt;
            // Готов ли канал, связанный с ключом, к записи?&lt;br /&gt;
            // if((key.readyOps() &amp;amp; SelectionKey.OP_WRITE) != 0)&lt;br /&gt;
            if (key.isWritable())&lt;br /&gt;
               System.out.println(&amp;quot;Write will not block&amp;quot;);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
      finally {&lt;br /&gt;
         ch.close();&lt;br /&gt;
         sel.close();&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
} // /:~&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9. EchoServerNIO==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.*;&lt;br /&gt;
import java.net.*;&lt;br /&gt;
import java.nio.*;&lt;br /&gt;
import java.nio.channels.*;&lt;br /&gt;
import java.nio.charset.*;&lt;br /&gt;
import java.util.*;&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
* Сервер принимает соединения не блокирующим способом. Когда соединение&lt;br /&gt;
* установлено, создается сокет, который регистрируется с селектором для&lt;br /&gt;
* чтения/записи. Чтение/запись выполняется над этим сокетом, когда селектор&lt;br /&gt;
* разблокируется. Эта программа работает точно так же, как и MultiJabberServer.&lt;br /&gt;
*/&lt;br /&gt;
public class EchoServerNIO {&lt;br /&gt;
   public static final int PORT = 8080;&lt;br /&gt;
  &lt;br /&gt;
   public static void main(String[] args) throws IOException {&lt;br /&gt;
      // Канал будет читать данные в ByteBuffer, посылаемые&lt;br /&gt;
      // методом PrintWriter.println(). Декодирование этого потока&lt;br /&gt;
      // байт требует кодовой страницы для кодировки по умолчанию.&lt;br /&gt;
      Charset cs = Charset.forName(System.getProperty(&amp;quot;file.encoding&amp;quot;));&lt;br /&gt;
      ByteBuffer buffer = ByteBuffer.allocate(16);&lt;br /&gt;
      SocketChannel ch = null;&lt;br /&gt;
      ServerSocketChannel ssc = ServerSocketChannel.open();&lt;br /&gt;
      Selector sel = Selector.open();&lt;br /&gt;
      try {&lt;br /&gt;
         ssc.configureBlocking(false);&lt;br /&gt;
         // Локальныйы адрес, на котором он будет слушать соединения&lt;br /&gt;
         // Примечание: Socket.getChannel() возвращает null, если с ним не&lt;br /&gt;
         // ассоциирован канал, как показано ниже.&lt;br /&gt;
         // т.е выражение (ssc.socket().getChannel() != null) справедливо&lt;br /&gt;
         ssc.socket().bind(new InetSocketAddress(PORT));&lt;br /&gt;
         // Канал заинтересован в событиях OP_ACCEPT&lt;br /&gt;
         ssc.register(sel, SelectionKey.OP_ACCEPT);&lt;br /&gt;
         System.out.println(&amp;quot;Server on port: &amp;quot; + PORT);&lt;br /&gt;
         while (true) {&lt;br /&gt;
            sel.select();&lt;br /&gt;
            Iterator&amp;lt;?&amp;gt; it = sel.selectedKeys().iterator();&lt;br /&gt;
            while (it.hasNext()) {&lt;br /&gt;
               SelectionKey skey = (SelectionKey) it.next();&lt;br /&gt;
               it.remove();&lt;br /&gt;
               if (skey.isAcceptable()) {&lt;br /&gt;
                  ch = ssc.accept();&lt;br /&gt;
                  System.out.println(&amp;quot;Accepted connection from:&amp;quot;&lt;br /&gt;
                        + ch.socket());&lt;br /&gt;
                  ch.configureBlocking(false);&lt;br /&gt;
                  ch.register(sel, SelectionKey.OP_READ);&lt;br /&gt;
               }&lt;br /&gt;
               else {&lt;br /&gt;
                  // Обратите внимание, что не выполняется проверка, если&lt;br /&gt;
                  // в канал можно писать или читать - для упрощения.&lt;br /&gt;
                  ch = (SocketChannel) skey.channel();&lt;br /&gt;
                  ch.read(buffer);&lt;br /&gt;
                  CharBuffer cb = cs.decode((ByteBuffer) buffer.flip());&lt;br /&gt;
                  String response = cb.toString();&lt;br /&gt;
                  System.out.print(&amp;quot;Echoing : &amp;quot; + response);&lt;br /&gt;
                  ch.write((ByteBuffer) buffer.rewind());&lt;br /&gt;
                  if (response.indexOf(&amp;quot;END&amp;quot;) != -1)&lt;br /&gt;
                     ch.close();&lt;br /&gt;
                  buffer.clear();&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
      finally {&lt;br /&gt;
         if (ch != null)&lt;br /&gt;
            ch.close();&lt;br /&gt;
         ssc.close();&lt;br /&gt;
         sel.close();&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
} // /:~&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. Worker==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.*;&lt;br /&gt;
import java.util.logging.*;&lt;br /&gt;
&lt;br /&gt;
public class Worker extends Thread {&lt;br /&gt;
   public static final Logger logger = Logger.getLogger(&amp;quot;Worker&amp;quot;);&lt;br /&gt;
   private String workerId;&lt;br /&gt;
   private Runnable task;&lt;br /&gt;
   // Необходима ссылка на пул нитей в котором существует нить, чтобы&lt;br /&gt;
   // нить могла добавить себя в пул нитей по завершению работы.&lt;br /&gt;
   private ThreadPool threadpool;&lt;br /&gt;
   static {&lt;br /&gt;
      try {&lt;br /&gt;
         logger.setUseParentHandlers(false);&lt;br /&gt;
         FileHandler ferr = new FileHandler(&amp;quot;WorkerErr.log&amp;quot;);&lt;br /&gt;
         ferr.setFormatter(new SimpleFormatter());&lt;br /&gt;
         logger.addHandler(ferr);&lt;br /&gt;
      }&lt;br /&gt;
      catch (IOException e) {&lt;br /&gt;
         System.out.println(&amp;quot;Logger not initialized..&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   public Worker(String id, ThreadPool pool) {&lt;br /&gt;
      workerId = id;&lt;br /&gt;
      threadpool = pool;&lt;br /&gt;
      start();&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   // ThreadPool, когда ставит в расписание задачу, использует этот метод&lt;br /&gt;
   // для делегирования задачи Worker-нити. Кроме того для установки&lt;br /&gt;
   // задачи (типа Runnable) он также переключает ожидающий метод&lt;br /&gt;
   // run() на начало выполнения задачи.&lt;br /&gt;
   public void setTask(Runnable t) {&lt;br /&gt;
      task = t;&lt;br /&gt;
      synchronized (this) {&lt;br /&gt;
         notify();&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   public void run() {&lt;br /&gt;
      try {&lt;br /&gt;
         while (!threadpool.isStopped()) {&lt;br /&gt;
            synchronized (this) {&lt;br /&gt;
               if (task != null) {&lt;br /&gt;
                  try {&lt;br /&gt;
                     task.run(); // Запускаем задачу&lt;br /&gt;
                  }&lt;br /&gt;
                  catch (Exception e) {&lt;br /&gt;
                     logger.log(Level.SEVERE,&lt;br /&gt;
                           &amp;quot;Exception in source Runnable task&amp;quot;, e);&lt;br /&gt;
                  }&lt;br /&gt;
                  // Возвращает себя в пул нитей&lt;br /&gt;
                  threadpool.putWorker(this);&lt;br /&gt;
               }&lt;br /&gt;
               wait();&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         System.out.println(this + &amp;quot; Stopped&amp;quot;);&lt;br /&gt;
      }&lt;br /&gt;
      catch (InterruptedException e) {&lt;br /&gt;
         throw new RuntimeException(e);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   public String toString() {&lt;br /&gt;
      return &amp;quot;Worker : &amp;quot; + workerId;&lt;br /&gt;
   }&lt;br /&gt;
} // /:~&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==11. ThreadPool ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.util.*;&lt;br /&gt;
&lt;br /&gt;
public class ThreadPool extends Thread {&lt;br /&gt;
   private static final int DEFAULT_NUM_WORKERS = 5;&lt;br /&gt;
   private LinkedList&amp;lt;Worker&amp;gt; workerPool = new LinkedList&amp;lt;Worker&amp;gt;();&lt;br /&gt;
   private LinkedList&amp;lt;Runnable&amp;gt; taskList = new LinkedList&amp;lt;Runnable&amp;gt;();&lt;br /&gt;
   private boolean stopped = false;&lt;br /&gt;
  &lt;br /&gt;
   public ThreadPool() {&lt;br /&gt;
      this(DEFAULT_NUM_WORKERS);&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   public ThreadPool(int numOfWorkers) {&lt;br /&gt;
      for (int i = 0; i &amp;lt; numOfWorkers; i++)&lt;br /&gt;
         workerPool.add(new Worker(&amp;quot;&amp;quot; + i, this));&lt;br /&gt;
      start();&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   public void run() {&lt;br /&gt;
      try {&lt;br /&gt;
         while (!stopped) {&lt;br /&gt;
            if (taskList.isEmpty()) {&lt;br /&gt;
               synchronized (taskList) {&lt;br /&gt;
                  // Если очередь пустая, подождать, пока будет добавлена&lt;br /&gt;
                  // задача&lt;br /&gt;
                  taskList.wait();&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
            else if (workerPool.isEmpty()) {&lt;br /&gt;
               synchronized (workerPool) {&lt;br /&gt;
                  // Если нет рабочих нитей, подождать, пока&lt;br /&gt;
                  // пока не появится&lt;br /&gt;
                  workerPool.wait();&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
            // Запускаем следующую задачу из расписания задач&lt;br /&gt;
            getWorker().setTask((Runnable) taskList.removeLast());&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
      catch (InterruptedException e) {&lt;br /&gt;
         throw new RuntimeException(e);&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   public void addTask(Runnable task) {&lt;br /&gt;
      taskList.addFirst(task);&lt;br /&gt;
      synchronized (taskList) {&lt;br /&gt;
         taskList.notify(); // Если добавлена новая задача, уведомляем&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   public void putWorker(Worker worker) {&lt;br /&gt;
      workerPool.addFirst(worker);&lt;br /&gt;
      // Здесь может быть случай, когда вы будете иметь пул из 5 нитей,&lt;br /&gt;
      // а будет требоваться больше. Это происходит тогда, когда требуется&lt;br /&gt;
      // рабочая нить,&lt;br /&gt;
      // но ее нет (свободной), тогда просто блокируем пул нитей.&lt;br /&gt;
      // Это событие, при котором появляется свободная рабочая нить в пуле&lt;br /&gt;
      // нитей&lt;br /&gt;
      // Поэтому эта нить посылает уведомление и разблокирует&lt;br /&gt;
      // нить ThreadPool, ожидающую пул нитей&lt;br /&gt;
      synchronized (workerPool) {&lt;br /&gt;
         workerPool.notify();&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   private Worker getWorker() {&lt;br /&gt;
      return (Worker) workerPool.removeLast();&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   public boolean isStopped() {&lt;br /&gt;
      return stopped;&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   public void stopThreads() {&lt;br /&gt;
      stopped = true;&lt;br /&gt;
      Iterator&amp;lt;Worker&amp;gt; it = workerPool.iterator();&lt;br /&gt;
      while (it.hasNext()) {&lt;br /&gt;
         Worker w = it.next();&lt;br /&gt;
         synchronized (w) {&lt;br /&gt;
            w.notify();&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   } // Junit test&lt;br /&gt;
  &lt;br /&gt;
   public void testThreadPool() {&lt;br /&gt;
      ThreadPool tp = new ThreadPool();&lt;br /&gt;
      for (int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;
         tp.addTask(new Runnable() {&lt;br /&gt;
            public void run() {&lt;br /&gt;
               System.out.println(&amp;quot;A&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
         });&lt;br /&gt;
      }&lt;br /&gt;
      tp.stopThreads();&lt;br /&gt;
   }&lt;br /&gt;
} // /:~&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 12. MultiEchoServerPool ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
import java.io.*;&lt;br /&gt;
&lt;br /&gt;
import java.net.*;&lt;br /&gt;
&lt;br /&gt;
import java.nio.*;&lt;br /&gt;
&lt;br /&gt;
import java.nio.channels.*;&lt;br /&gt;
&lt;br /&gt;
import java.nio.charset.*;&lt;br /&gt;
&lt;br /&gt;
import java.util.*;&lt;br /&gt;
&lt;br /&gt;
class ServeOneEcho implements Runnable {&lt;br /&gt;
   private SocketChannel channel;&lt;br /&gt;
   private Selector sel;&lt;br /&gt;
  &lt;br /&gt;
   public ServeOneEcho(SocketChannel ch) throws IOException {&lt;br /&gt;
      channel = ch;&lt;br /&gt;
      sel = Selector.open();&lt;br /&gt;
   }&lt;br /&gt;
  &lt;br /&gt;
   public void run() {&lt;br /&gt;
      ByteBuffer buffer = ByteBuffer.allocate(16);&lt;br /&gt;
      boolean read = false, done = false;&lt;br /&gt;
      String response = null;&lt;br /&gt;
      try {&lt;br /&gt;
         channel.register(sel, SelectionKey.OP_READ | SelectionKey.OP_WRITE);&lt;br /&gt;
         while (!done) {&lt;br /&gt;
            sel.select();&lt;br /&gt;
            Iterator&amp;lt;?&amp;gt; it = sel.selectedKeys().iterator();&lt;br /&gt;
            while (it.hasNext()) {&lt;br /&gt;
               SelectionKey key = (SelectionKey) it.next();&lt;br /&gt;
               it.remove();&lt;br /&gt;
               if (key.isReadable() &amp;amp;&amp;amp; !read) {&lt;br /&gt;
                  if (channel.read(buffer) &amp;gt; 0)&lt;br /&gt;
                     read = true;&lt;br /&gt;
                  CharBuffer cb = MultiEchoServerPool.CS&lt;br /&gt;
                        .decode((ByteBuffer) buffer.flip());&lt;br /&gt;
                  response = cb.toString();&lt;br /&gt;
               }&lt;br /&gt;
               if (key.isWritable() &amp;amp;&amp;amp; read) {&lt;br /&gt;
                  System.out.print(&amp;quot;Echoing : &amp;quot; + response);&lt;br /&gt;
                  channel.write((ByteBuffer) buffer.rewind());&lt;br /&gt;
                  if (response.indexOf(&amp;quot;END&amp;quot;) != -1)&lt;br /&gt;
                     done = true;&lt;br /&gt;
                  buffer.clear();&lt;br /&gt;
                  read = false;&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
      catch (IOException e) {&lt;br /&gt;
         // будет поймано Worker.java и залогировано.&lt;br /&gt;
         // Необходимо выбросить исключение времени выполнения, так как мы не&lt;br /&gt;
         // можем&lt;br /&gt;
         // оставить IOException&lt;br /&gt;
         throw new RuntimeException(e);&lt;br /&gt;
      }&lt;br /&gt;
      finally {&lt;br /&gt;
         try {&lt;br /&gt;
            channel.close();&lt;br /&gt;
         }&lt;br /&gt;
         catch (IOException e) {&lt;br /&gt;
            System.out.println(&amp;quot;Channel not closed.&amp;quot;);&lt;br /&gt;
            // Выбрасываем это, чтобы рабочая нить могла залогировать.&lt;br /&gt;
            throw new RuntimeException(e);&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public class MultiEchoServerPool {&lt;br /&gt;
   public static final int PORT = 8080;&lt;br /&gt;
   private static String encoding = System.getProperty(&amp;quot;file.encoding&amp;quot;);&lt;br /&gt;
   public static final Charset CS = Charset.forName(encoding);&lt;br /&gt;
   // Создаем пул нитей с 20 рабочими нитями.&lt;br /&gt;
   private static ThreadPool pool = new ThreadPool(20);&lt;br /&gt;
  &lt;br /&gt;
   public static void main(String[] args) throws IOException {&lt;br /&gt;
      ServerSocketChannel ssc = ServerSocketChannel.open();&lt;br /&gt;
      Selector sel = Selector.open();&lt;br /&gt;
      try {&lt;br /&gt;
         ssc.configureBlocking(false);&lt;br /&gt;
         ssc.socket().bind(new InetSocketAddress(PORT));&lt;br /&gt;
         ssc.register(sel, SelectionKey.OP_ACCEPT);&lt;br /&gt;
         System.out.println(&amp;quot;Server on port: &amp;quot; + PORT);&lt;br /&gt;
         while (true) {&lt;br /&gt;
            sel.select();&lt;br /&gt;
            Iterator&amp;lt;?&amp;gt; it = sel.selectedKeys().iterator();&lt;br /&gt;
            while (it.hasNext()) {&lt;br /&gt;
               SelectionKey skey = (SelectionKey) it.next();&lt;br /&gt;
               it.remove();&lt;br /&gt;
               if (skey.isAcceptable()) {&lt;br /&gt;
                  SocketChannel channel = ssc.accept();&lt;br /&gt;
                  System.out.println(&amp;quot;Accepted connection from:&amp;quot;&lt;br /&gt;
                        + channel.socket());&lt;br /&gt;
                  channel.configureBlocking(false);&lt;br /&gt;
                  // Отделяем события и ассоциированное действие&lt;br /&gt;
                  pool.addTask(new ServeOneEcho(channel));&lt;br /&gt;
               }&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
      finally {&lt;br /&gt;
         ssc.close();&lt;br /&gt;
         sel.close();&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
} // /:~&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Antonk</name></author>	</entry>

	</feed>