SlideShare a Scribd company logo
1 of 40
Download to read offline
МАИ, каф 806, Сети ЭВМ 
Программируем сокеты 
1
МАИ, каф 806, Сети ЭВМ 2 
Сокеты 
Сокет –специальный дескриптор файла, для взаимодействия с сетью (термин произошел из UNIX). 
Работает напрямую с транспортным уровнем стека TCP/IP. 
Два типа сокетов: 
 Сервис с соединением (на базе TCP). 
 Сервис без соединения (на базе UDP). 
a.
МАИ, каф 806, Сети ЭВМ 
Сокеты с соединениемпротокол TCP 
Сервис с соединением 
Гарантированная доставка 
Сохраняет последовательность переданных сообщений 
Управление диалогом (можно передавать и получать данные тогда когда нам удобно) 
Не очень быстрый 
Сокеты Беркли могут работать в одном из двух режимов: блокирующем или неблокирующем. Блокирующий сокет не возвращает контроль пока не отошлет (или пока не получит) все данные, указанные для операции. 
3
МАИ, каф 806, Сети ЭВМ 
Потоки 
В общем случае при передаче данных в сеть (и соответственно при приеме) мы будем работать с сетью как с файлами. 
Мы будем писать и считывать данные «поточным» образом. Т.е. сеть для нас будет своего рода очередью. 
Важно понимать, что поскольку данные передаются пакетами, то перед отправкой происходит группировка данных. Таким образом, данные отправляются в сеть не сразу, а в некоторый (случайный для верхнего слоя протокола) момент. 
Можно управлять отправкой данных принудительно отправив буфер в сеть. 
4
МАИ, каф 806, Сети ЭВМ 5 
Сокеты с соединением. 
Клиентское приложениеСерверное приложениеКлиентский сокетПоток получения данныхПоток отправки данныхСерверный сокетКлиентский сокетПоток отправки данныхПоток получения данныхВиртуальный диалогДанные соединенияСлужебные данныеПользовательские данныеПользовательские данные
МАИ, каф 806, Сети ЭВМ 
В терминах C# 
В момент работы метода accept происходит «зависание» сервера в ожидании входящего соединения. 
6
МАИ, каф 806, Сети ЭВМ 
Базовые классы005_Address 
System.Net.IPAddress 
http://msdn.microsoft.com/ru- ru/library/system.net.ipaddress.aspx 
 Конструкторы 
•Byte[] 
•Int64 
 Статические свойства 
•Any 
•Broadcast 
•Loopback 
•None 
 Методы 
•Parse (статический). 
•TryParse (статический) 
•ToString 
IPAddress test1 = IPAddress.Parse("192.168.1.1"); 
IPAddress test2 = IPAddress.Loopback; 
IPAddress test3 = IPAddress.Broadcast; 
IPAddress test4 = IPAddress.Any; 
IPAddress test5 = IPAddress.None; 
IPHostEntry ihe = Dns.GetHostEntry(Dns.GetHostName()); 
7
МАИ, каф 806, Сети ЭВМ 
Базовые классы006_EndPoint 
System.Net.IPEndPoint 
http://msdn.microsoft.com/ru- ru/library/system.net.ipendpoint.aspx 
 Конструкторы 
•IPEndPoint(IPAddress, Int32) 
 Статические свойства 
•MaxPort 
•MinPort 
 Свойства 
•Address 
•AddessFamily 
•Port 
IPHostEntry ihe = Dns.GetHostEntry(Dns.GetHostName()); 
IPAddress test1 = ihe.AddressList[0]; 
IPEndPoint ie = new IPEndPoint(test1, 8000); 
8
МАИ, каф 806, Сети ЭВМ 9 
Сокеты с соединением. С#.Базовые классы 
1.using System; 
2.using System.Net; 
3.namespace _06_EndPoint 
4.{ 
5.class Program 
6.{ 
7.static void Main(string[] args) 
8.{ 
9.IPAddress test1 = IPAddress.Parse("192.168.1.1"); 
10.IPEndPoint ie = new IPEndPoint(test1, 8000); 
11.Console.WriteLine("The IPEndPoint is: {0}",ie.ToString()); 
12.Console.WriteLine("The AddressFamily is: {0}",ie.AddressFamily); 
13.Console.WriteLine("The address is: {0}, and the port is: {1}n", ie.Address, ie.Port); 
14.Console.WriteLine("The min port number is: {0}",IPEndPoint.MinPort); 
15.Console.WriteLine("The max port number is: {0}n",IPEndPoint.MaxPort); 
16.ie.Port = 80; 
17.Console.WriteLine("The changed IPEndPoint value is: {0}", ie.ToString()); 
18.SocketAddress sa = ie.Serialize(); 
19.Console.WriteLine("The SocketAddress is: {0}", sa.ToString()); 
20.} 
21.} 
22.}
МАИ, каф 806, Сети ЭВМ 10 
Сокеты с соединением. С#. Сервер. 
Базовые классы 
 System.Net.IPEndPoint 
 System.Net.IPAddress 
 System.Net.Sockets.Socket 
Сценарий 
 Создание точки подсоединения 
 Создание сокета 
 Связывание точки подсоединения и сокета 
 Ожидание соединения 
 Соединение с клиентом 
 Отправка/передача данных 
 Завершение сеанса связи с клиентом 
 Завершение ожидания подсоединения.
МАИ, каф 806, Сети ЭВМ 11 
Сокеты с соединением. С#. Сервер. немного UML 
sd C# СерверПрограмма Сервер:IPEndPoint:Socket:Socketloop Последовательность определяется прикладным протоколомloop Пока реаботает серверbind() listen() Accept() SocketReceive() Send() Shutdown() Close() Close()
МАИ, каф 806, Сети ЭВМ 12 
Сокеты с соединением. С#. Клиент. 
Базовые классы 
 System.Net.IPEndPoint 
 System.Net.IPAddress 
 System.Net.Sockets.Socket 
Сценарий 
 Создание точки подсоединения 
 Создание сокета 
 Связывание точки подсоединения и сокета 
 Соединение с сервером 
 Отправка/передача данных 
 Завершение сеанса связи с сервером
МАИ, каф 806, Сети ЭВМ 13 
Сокеты с соединением. С#. Клиентнемного UML 
sd С# КлиентПрограмма Клиент:IPEndPoint:Socketloop Последовательность определяется прикладным протоколомConnect() Send() Receive() Shutdown() Close()
МАИ, каф 806, Сети ЭВМ 
Пример использование TCP Socket [1/2] .NET Framework 
privatestaticvoidOnBeginAccept(IAsyncResultar) 
{ 
Socketlistener=(Socket)ar.AsyncState; 
using(Socketclient=listener.EndAccept(ar)) 
{ 
byte[]buffer=newbyte[_bufferSize]; 
client.Receive(buffer); 
buffer=Encoding.UTF8.GetBytes(string.Format("Hello,{0}", Encoding.UTF8.GetString(buffer))); 
client.Send(buffer); 
} 
} 
14
МАИ, каф 806, Сети ЭВМ 
Пример использование TCP Socket [2/2] .NET Framework 
staticvoidMain(string[]args) 
{ 
EndPointendPoint=newIPEndPoint(IPAddress.Loopback,8320); 
using(Socketlistener=newSocket(endPoint.AddressFamily,SocketType.Stream,ProtocolType.Tcp)) 
using(Socketclient=newSocket(endPoint.AddressFamily,SocketType.Stream,ProtocolType.Tcp)) 
{ 
listener.Bind(endPoint); 
listener.Listen(1); 
listener.BeginAccept(newAsyncCallback(OnBeginAccept),listener); 
client.Connect(endPoint); 
Console.Write("Введитесообщение:"); 
stringrequest=Console.ReadLine(); 
intcount=client.Send(Encoding.UTF8.GetBytes(request)); 
byte[]buffer=newbyte[_bufferSize]; 
client.Receive(buffer); 
stringresponse=Encoding.UTF8.GetString(buffer); 
intindex=response.IndexOf('0'); 
Console.WriteLine(string.Format("Ответсервера:{0}", 
response.Remove(index))); 
} 
} 
15
МАИ, каф 806, Сети ЭВМ 
Сокеты и безопасностьNegotiateStream-Клиент 
static void Main(string[] args) 
{ 
TcpClient client = new TcpClient(); 
client.Connect("localhost", 4242); 
NegotiateStream kerb = new NegotiateStream(client.GetStream()); 
kerb.AuthenticateAsClient(CredentialCache.DefaultNetworkCredentials, @"stsddzuba", 
ProtectionLevel.EncryptAndSign, 
System.Security.Principal.TokenImpersonationLevel.Impersonation); 
StreamWriter writer = new StreamWriter(kerb); 
writer.WriteLine("Hello kerberized Server"); 
} 
16
МАИ, каф 806, Сети ЭВМ 
Сокеты и безопасностьNegotiateStream-Сервер 
static void Main(string[] args) 
{ 
TcpListener listener = new TcpListener(4242); 
listener.Start(); 
TcpClient client = listener.AcceptTcpClient(); 
NegotiateStream kerb = new NegotiateStream(client.GetStream()); 
kerb.AuthenticateAsServer(CredentialCache.DefaultNetworkCredentials, 
ProtectionLevel.EncryptAndSign, 
TokenImpersonationLevel.Impersonation); 
Console.WriteLine("Client Identity: {0}", kerb.RemoteIdentity.Name); 
WindowsPrincipal principal = newWindowsPrincipal((WindowsIdentity)kerb.RemoteIdentity); 
Console.WriteLine("Is Admin? : {0}", principal.IsInRole(WindowsBuiltInRole.Administrator)); 
Thread.CurrentPrincipal = principal; 
DoSomethingOnlyUsersCanDo(); 
} 
[PrincipalPermission(SecurityAction.Demand, Role=@"Пользователи")] 
static void DoSomethingOnlyUsersCanDo() 
{Console.WriteLine("Users only");} 
17
МАИ, каф 806, Сети ЭВМ 
Сокеты без соединенияпротокол UDP 
Сервис без соединения (т.е. пересылаем автономные пакеты) 
Не гарантированная доставка. 
Не гарантированная последовательность. 
Очень быстрый 
Пример использования: при авторизации клиентов для работы с интернет (популярный протокол RADIUS реализован поверх UDP) 
18
МАИ, каф 806, Сети ЭВМ 19 
Сокеты без соединения. C#. СерверПротокол UDP 
1.using System; 
2.using System.Net; 
3.using System.Net.Sockets; 
4.using System.Collections.Generic; 
5.using System.Text; 
6.namespace _08_UDPClient 
7.{ 
8.class Program 
9.{ 
10.static void Main(string[] args) 
11.{ 
12.int recv; 
13.byte[] data = new byte[1024]; 
14.IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050); 
15.Socket newsock = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); 
16.newsock.Bind(ipep); 
17.Console.WriteLine("Waiting for a client..."); 
18.IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); 
19.EndPoint Remote = (EndPoint)(sender); 
20.recv = newsock.ReceiveFrom(data, ref Remote); 
21.Console.WriteLine("Message received from {0}:", Remote.ToString()); 
22.Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); 
23.string welcome = "Welcome to my test server"; 
24.data = Encoding.ASCII.GetBytes(welcome); 
25.newsock.SendTo(data, data.Length, SocketFlags.None, Remote); 
26.while (true) { 
27.data = new byte[1024]; 
28.recv = newsock.ReceiveFrom(data, ref Remote); 
29.Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); 
30.newsock.SendTo(data, recv, SocketFlags.None, Remote); 
31.} 
32.} 
33.} 
34.}
МАИ, каф 806, Сети ЭВМ 20 
Сокеты без соединения. C#. Broadcast сообщения 
1.using System; 
2.using System.Collections.Generic; 
3.using System.Text; 
4.using System.Net; 
5.using System.Net.Sockets; 
6.namespace _09_Broadcst 
7.{ 
8.class Program 
9.{ 
10.static void Main(string[] args) 
11.{ 
12.Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp); 
13.IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 9050); 
14.IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("192.168.1.255"), 9050); 
15.string hostname = Dns.GetHostName(); 
16.byte[] data = Encoding.ASCII.GetBytes(hostname); 
17.sock.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast, 1); 
18.sock.SendTo(data, iep1); 
19.sock.SendTo(data, iep2); 
20.sock.Close(); 
21.} 
22.} 
23.}
МАИ, каф 806, Сети ЭВМ 
Как передать данные на другой компьютер? 
Протокол данных TCP и UDP предоставляют сервис по передаче данных в виде последовательности байт. 
Как передать сложные структуры данных? 
Необходима реализация дополнительного слоя, предоставляющего сервис по преобразованию данных из нужного формата в поток байт и обратно. 
Как это сделать наиболее просто? 
21
МАИ, каф 806, Сети ЭВМ 
Как передать объект на другую машину? сериализацияв .NET 
В отличие от приложений на неуправляемом коде, приложения .NET Framework не обязательно выполняются в виде отдельных процессов, а могут существовать в пределах одного процесса операционной системы в своих собственных областях, называемых доменами приложения. Такие области можно рассматривать как некоторые логические процессы виртуальной машины CLR. 
При передаче между доменами приложений некоторого объекта для его класса должна быть определена процедура сериализации, которая позволяетсохранитьсостояние объекта в некотором внешнем хранилище (например, в файле, или в сообщении транспортного протокола) припомощипотоков ввода-вывода, и процедура десериализации, создающая копию объекта по сохраненному состоянию 
22
МАИ, каф 806, Сети ЭВМ 
А что если объект сложный? граф объектов 
Задача сериализации объекта, включающего только поля из элементарных типов значений (наследников классаSystem.ValueType) и строк, не представляет принципиальных трудностей. Для такого объекта в ходе сериализации в поток записываются сами значения всех полей объекта. Однако в общем случае объект содержит ссылки на другие объекты, которые, в свою очередь, могут ссылаться друг на друга, образуя так называемый граф объектов (object graph). 23 
public class SampleClass 
{ 
public SampleClassfieldA= null; 
public SampleClassfieldB= null; 
} 
... 
SampleClassroot = new SampleClass(); 
SampleClasschild1 = new SampleClass(); 
SampleClasschild2 = new SampleClass(); 
root.fieldA= child1; 
root.fieldB= child2; 
child1.fieldA = child2;
МАИ, каф 806, Сети ЭВМ 
Просто пронумеруем объектыпочти как ссылки в C++ 
ObjectID ? В ходе сериализации объектам должны быть поставлены в соответствие некоторые идентификаторы, и в хранилище отдельно сохраняется список объектов, отмеченный идентификаторами, а при сериализации вместо ссылок записываются идентификаторы ссылаемых объектов. 
Виртуальный адрес! В программе роль идентификатора объекта выполняет его адрес, но вместо него обычно удобнее назначить некоторые идентификаторы в процедуре сериализации для более легкого чтения человеком полученного образа. 
Hash-map … В ходе сериализации нужно ввести список адресов уже записанных объектов, как для ведения списка идентификаторов, так и для обнаружения возможных циклов при обходе графа методом в глубину. 
24
МАИ, каф 806, Сети ЭВМ 
.Net Frameworkчем нам поможет? 
В .NET Framework выделяется три различных независимых класса форматирования: 
 XmlSerializer 
 SoapFormatter 
 BinaryFormatter. 
Технологии 
технология веб служб ASP.NETиспользуетXmlSerializer; 
технология RemotingиспользуетSoapFormatter,BinaryFormatterили созданный пользователем класс; 
при работе с сообщениями MSMQиспользуетсяXmlSerializer(черезXMLMessageFormatter), илиBinaryFormatter(через BinaryMessageFormatter), или созданный пользователем класс; 
технология Enterprise Services основана на Remoting и используетBinaryFormatter. 
25
МАИ, каф 806, Сети ЭВМ 
System.Xml.XmlSerializer 
КлассXmlSerializerреализует открытый текстовый метод сериализации,использующийXML в качестве базового формата хранения и схемы XML для спецификации документа с результатом сериализации. 
Начиная с .NET Framework2.0XmlSerializerпозволяет сериализоватьпубличные классы, имеющие конструктор без параметров типаpublicи отвечающие одному из следующих требований: 
Класс реализует интерфейсIXMLSerializable. В этом случаеXmlSerializerпросто использует при сериализацииметоды классаGetSchema,ReadXml,WriteXml. 
Класс реализует интерфейсSystem.Collections.IEnumerable, но не реализуетICollectionи содержит публичный методAddc единственным параметром, имеющим тип, совпадающий с типом результатасвойстваIEnumerator.CurrentметодаGetEnumeratorсериализуемогообъекта. Такой класс сериализуетсячерез вызовы классаIEnumerator, возвращаемого методомGetEnumerator, а его публичные поля и свойства не сериализуются. 
Класс реализует интерфейсSystem.Collections.ICollection, но не реализуетIEnumerable. Для такого класса осуществляется сериализациятолько свойстваItemи публичных полей, реализующих интерфейсICollection. Другие публичные поля и свойства не сериализуются. 
Класс реализует интерфейсыICollectionиIEnumerable, имеет публичное индексированное свойствоItemc целым индексом и публичное целое свойствоCount. Тип, принимаемый методомAdd, должен быть типом свойстваItemили одним из его предков. Другие публичные поля и свойства не сериализуются. 
Класс не реализует ни один из интерфейсовIXMLSerializer,IEnumerable,ICollectionи имеет атрибутSystem.SerializableAttribute. В этом случае будут сериализованыпубличные свойства и поля класса с учетом специальных атрибутов, управляющих процессом сериализации. 
 Подлежащие сериализациипубличные свойства должны иметь реализацию обоих методов,getиset. Кроме того, если класс не использует собственную процедуру сериализации, то он не должен иметь свойств или полей типа интерфейс или многомерных массивов, вместо них следует использовать вложенные массивы. 
26
МАИ, каф 806, Сети ЭВМ 
Работа с XSD схемами 
В состав .NET Framework входит утилитаxsd.exe, позволяющая выполнять три основные задачи: 
создание частичного (partial) описания класса на С# по схеме XSD; 
создание схемы XSD по классу С#; 
создание схемы XSD по образцу XML-файла (правильность зависит от полноты образца). 
Формат: xsd.exe assembly/type:type_name 
Таким образом, прииспользованиидля обмена данными между компонентами классаXmlSerializerможно как создать схему по сериализуемому классу и представить ее в качестве спецификации передаваемых данных, так и сгенерировать на языке C# код описания публичных свойств класса из XSD-схемы. 
27
МАИ, каф 806, Сети ЭВМ 
XmlSerializerитого 
Особенностью классаXMLSerializerявляется то, что в ходе работы он создает сборки с кодом сериализации для каждого обрабатываемого класса при вызове его конструктора. 
Если такая задержка нежелательна (например, программа не совершает повторяющейся сериализации одного и того же класса, но желает при этом осуществлять операции максимально быстро), то при помощи утилиты sgen.exe можно заранее создать такие сборки и затем подключить их к проекту. 
Резюмируя краткое описаниеXMLSerializer, следует отметить, что несмотря на отдельные сложности его применения к некоторым классам, его использование позволяет создать открытое взаимодействия удаленных компонент со спецификацией сериализуемых классов в виде схемы XSD. 
28
МАИ, каф 806, Сети ЭВМ 
System.Runtime.Serialization.Formatters.Soap.SoapFormatterSystem.Runtime.Serialization.Formatters.Binary.BinaryFormatter 
Класс форматированияBinaryFormatterреализует двоичный закрытый метод сериализации. 
КлассSoapFormatter–текстовый и открытый, основанный на спецификации кодирования SOAP-RPC 
Оба указанных класса в простейшем случае при сериализации сохраняют все поля класса (но не его свойства), вне зависимости от их видимости. 
Поля, имеющие атрибутSystem.NonSerializeAttribute, игнорируются. 
Класс должен иметь атрибутSystem.SerializableAttribute. 
Если же обрабатываемый класс реализует интерфейсISerializable: 
 он сериализуется вызовом GetObjectData(SerializationInfo info, StreamingContext context) 
 десериализация таких классов осуществляется вызовом конструктораISerializable(SerializationInfo info, StreamingContext context) 
29
МАИ, каф 806, Сети ЭВМ 
SOCKET 
java 
30
МАИ, каф 806, Сети ЭВМ 31 
Сокеты с соединениемна примере JAVA 
Носитель 
Информации 
java.io.OutputStream 
Буфер 
write 
Байт 
java.io.InputStream 
read 
Байт 
Байт 
Байт 
flush
МАИ, каф 806, Сети ЭВМ 32 
Носитель Информации 
Потокив JavaПаттерн Decorator 
Базовые интерфейсы 
 InputStream 
 OutputStream 
Потоки-декораторы 
 BufferedInputStream 
 BufferedOutputStream 
 DataInputStream 
 DataOutputStream 
 ObjectInputStream 
 ObjectOutputStream 
 PrintStream 
Простые потоки 
 FileInputStream 
 FileOutputStream 
 ByteArrayInputStream 
 ByteArrayOutputStream 
Носитель Информации 
Поток-Модификатор 
Метод Доступа потока-декоратора 
Метод Доступа потока 
Метод Доступа потока-декоратора 
Метод приложения пользователя
МАИ, каф 806, Сети ЭВМ 33 
Сокеты с соединением Java. Базовые классы 
java.net.InetAddress 
 Конструкторы –нет 
 Статические методы 
•getLocalHost 
•getByName 
•getAllByName 
 Пример 
1.import java.net.*; 
2.classInetAddressTest 
3.{ 
4.publicstaticvoidmain(Stringargs[]) throwsUnknownHostException 
5.{ 
6.InetAddress Address = InetAddress.getLocalHost(); 
7.System.out.println(Address); 
8.Address = InetAddress.getByName("www.soshnikov.com"); 
9.System.out.println(Address); 
10.InetAddress SW[] = InetAddress.getAllByName("www.mai.ru"); 
11.for(inti=0; i<SW.length; i++) 
12.System.out.println (SW[i]) ; 
13.} 
14.}
МАИ, каф 806, Сети ЭВМ 34 
Сокеты с соединением. Java. Сервер. 
Базовые классы 
 java.net.Socket 
 java.net.ServerSocket 
 java.io.InputStream 
 java.io.OutputStream 
Сценарий 
 Создание сокета 
 Ожидание соединения 
 Соединение с клиентом 
 Создание объектов-потоков 
 Отправка/передача данных 
 Удаление объектов-потоков 
 Завершение сеанса связи с клиентом 
 Завершение ожидания подсоединения.
МАИ, каф 806, Сети ЭВМ 35 
Сокеты с соединением. Java. Сервер. 
1.importjava.net.*; 
2.importjava.io.*; 
3.publicclassServerExample 
4.{ 
5.publicstaticvoidmain(Stringargv[]) 
6.{ 
7.try{ 
8.ServerSocket server= newServerSocket(2345); 
9.while(true) 
10.{ 
11.Socket client = server.accept(); 
12.OutputStream os = client.getOutputStream(); 
13.os.write("Hello World!".getBytes()); 
14.os.flush(); 
15.client.close(); 
16.} 
17.} catch(IOException e) 
18.{ 
19.} 
20.} 
21.}
МАИ, каф 806, Сети ЭВМ 36 
Сокеты с соединением. Java. Клиент. 
Базовые классы 
 java.net.Socket 
 java.net.InetAddress 
 java.io.InputStream 
 java.io.OutputStream 
Сценарий 
 Создание адреса 
 Создание сокета 
 Соединение с сервером 
 Создание объектов-потоков 
 Отправка/передача данных 
 Удаление объектов-потоков 
 Завершение сеанса связи с сервером
МАИ, каф 806, Сети ЭВМ 37 
Сокеты с соединением. Java. Клиент. 
1.importjava.net.*; 
2.importjava.io.*; 
3.publicclassClientExample 
4.{ 
5.publicstaticvoidmain(Stringargv[]) 
6.{ 
7.try{ 
8.Socket client = new Socket(InetAddress.getLocalHost(),2048); 
9.ObjectOutputStream os = new ObjectOutputStream(client.getOutputStream()); 
10.ObjectInputStream is = new ObjectInputStream(client.getInputStream()); 
11.os.write(“Hello server!”); 
12.Object result = is.readObject(); 
13.os.flush(); 
14.client.close(); 
15.} 
16.} catch(Exception e) 
17.{ 
18.} 
19.} 
20.}
МАИ, каф 806, Сети ЭВМ 38 
Сокеты без соединения.Javaпротокол UDP 
Классы 
 java.net.DatagramSocket 
 java.net.DatagramPacket 
Пример: 
1.bytebuffer[] = newbyte[1024]; 
2.DatagramSocket ds = newDatagramSocket(1111); 
3.ds.send(new DatagramPacket( buffer, buffer.length, InetAddress.getLocalHost(), 2222)); 
4.DatagramPacket p = newDatagramPacket(buffer, buffer.length); 
5.ds.receive(p); 
6.System.out.println(new String(p.getData(),0,0,p.getLength())) ;
МАИ, каф 806, Сети ЭВМ 
Библиотека java.nioнеблокирующие сокеты и цикличный буфер 
Классы 
 ServerSocketChannel 
 SocketChannel 
Использование 
ByteBufferbuffer = ByteBuffer.allocate(4096); ServerSocketChannelssc= ServerSocketChannel.open(); ssc.socket().bind(new InetSocketAddress(8080)); ssc.configureBlocking(false); 
… 
buffer.rewind(); sc.read(buffer) 
39
МАИ, каф 806, Сети ЭВМ 
Немного о проблемах написания высокопроизводительных серверов 
Большое количество клиентов, и большое количество запросов от клиентов требуют от сервера эффективности обработки запросов. 
Какие задачи выполняет сервер? 
 Получает запрос от клиента 
 Читает данные из сети 
 Выполняет вычисления 
 Отправляет данные клиенту 
Создавая много потоков (Thread) мы потребляем много ресурсов, что приводит к деградации производительности. 
Основные вопросы: 
 Размер пула потоков? 
 Один поток на каждого клиента? 
 Один поток на всех клиентов и много потоков обработчиков? 
40

More Related Content

What's hot

Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...Ontico
 
МАИ, Сети ЭВМ, Лекция №4
МАИ, Сети ЭВМ, Лекция №4МАИ, Сети ЭВМ, Лекция №4
МАИ, Сети ЭВМ, Лекция №4Dima Dzuba
 
Get inside stage2 new
Get inside stage2 newGet inside stage2 new
Get inside stage2 newInfoTeCS
 
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresProit-people
 
Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Ontico
 
Web весна 2012 лекция 12
Web весна 2012 лекция 12Web весна 2012 лекция 12
Web весна 2012 лекция 12Technopark
 
Ip адресация
Ip адресацияIp адресация
Ip адресацияAnis Aliev
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1Technopark
 
Повышаем отказоустойчивость без дорогих решений
Повышаем отказоустойчивость без дорогих решенийПовышаем отказоустойчивость без дорогих решений
Повышаем отказоустойчивость без дорогих решенийLenvendo
 
Вячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSВячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSYandex
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache MahoutTechnopark
 
Web весна 2012 лекция 2
Web весна 2012 лекция 2Web весна 2012 лекция 2
Web весна 2012 лекция 2Technopark
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Ontico
 
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...Ontico
 
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Alexey Lesovsky
 
Серия EMC Data Domain DD600
Серия EMC Data Domain DD600Серия EMC Data Domain DD600
Серия EMC Data Domain DD600КРОК
 
PostgreSQL Streaming Replication
PostgreSQL Streaming ReplicationPostgreSQL Streaming Replication
PostgreSQL Streaming ReplicationAlexey Lesovsky
 
FreeRTOS
FreeRTOSFreeRTOS
FreeRTOSquakke
 

What's hot (20)

Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
Разработка высокопроизводительных серверных приложений для Linux/Unix (Алекса...
 
МАИ, Сети ЭВМ, Лекция №4
МАИ, Сети ЭВМ, Лекция №4МАИ, Сети ЭВМ, Лекция №4
МАИ, Сети ЭВМ, Лекция №4
 
Get inside stage2 new
Get inside stage2 newGet inside stage2 new
Get inside stage2 new
 
Net2
Net2Net2
Net2
 
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
"Мультимастер для PostgreSQL" Кельвич Станислав, Книжник Константин, PostgresPro
 
Multimaster2
Multimaster2Multimaster2
Multimaster2
 
Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)Механика DDoS (Александр Крижановский)
Механика DDoS (Александр Крижановский)
 
Web весна 2012 лекция 12
Web весна 2012 лекция 12Web весна 2012 лекция 12
Web весна 2012 лекция 12
 
Ip адресация
Ip адресацияIp адресация
Ip адресация
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1
 
Повышаем отказоустойчивость без дорогих решений
Повышаем отказоустойчивость без дорогих решенийПовышаем отказоустойчивость без дорогих решений
Повышаем отказоустойчивость без дорогих решений
 
Вячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSВячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPS
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Web весна 2012 лекция 2
Web весна 2012 лекция 2Web весна 2012 лекция 2
Web весна 2012 лекция 2
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)
 
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
 
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.
 
Серия EMC Data Domain DD600
Серия EMC Data Domain DD600Серия EMC Data Domain DD600
Серия EMC Data Domain DD600
 
PostgreSQL Streaming Replication
PostgreSQL Streaming ReplicationPostgreSQL Streaming Replication
PostgreSQL Streaming Replication
 
FreeRTOS
FreeRTOSFreeRTOS
FreeRTOS
 

Similar to МАИ, Сети ЭВМ, Лекция №3

Java. Lecture 09. Network Programming
Java. Lecture 09. Network ProgrammingJava. Lecture 09. Network Programming
Java. Lecture 09. Network Programmingcolriot
 
Msu.Center.Lectures.J09 Network Programming
Msu.Center.Lectures.J09 Network ProgrammingMsu.Center.Lectures.J09 Network Programming
Msu.Center.Lectures.J09 Network Programmingolegol
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NETPositive Hack Days
 
Инфрраструктура ЦОД - интерконнект от Qlogik
Инфрраструктура ЦОД - интерконнект от QlogikИнфрраструктура ЦОД - интерконнект от Qlogik
Инфрраструктура ЦОД - интерконнект от QlogikExpolink
 
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетикеАлександр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетикеKaspersky
 
Принципы работы интернет.
Принципы работы интернет. Принципы работы интернет.
Принципы работы интернет. Dmitry Chabanenko
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Ontico
 
Web весна 2012 лекция 3
Web весна 2012 лекция 3Web весна 2012 лекция 3
Web весна 2012 лекция 3Technopark
 
C++ Базовый. Занятие 13.
C++ Базовый. Занятие 13.C++ Базовый. Занятие 13.
C++ Базовый. Занятие 13.Igor Shkulipa
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализацияYandex
 
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...Ontico
 
MUM Построение сети доступа на основе технологий DHCP + Radius на Mikrotik
MUM Построение сети доступа на основе технологий DHCP + Radius на Mikrotik MUM Построение сети доступа на основе технологий DHCP + Radius на Mikrotik
MUM Построение сети доступа на основе технологий DHCP + Radius на Mikrotik Naim Shafiev
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Yandex
 
Qlogic: Технологии Ethernet
Qlogic: Технологии EthernetQlogic: Технологии Ethernet
Qlogic: Технологии EthernetExpolink
 
Функциональные сети на основе библиотеки SynapseGrid
Функциональные сети на основе библиотеки SynapseGridФункциональные сети на основе библиотеки SynapseGrid
Функциональные сети на основе библиотеки SynapseGridАрсений Жижелев
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Vladimir Kochetkov
 

Similar to МАИ, Сети ЭВМ, Лекция №3 (20)

Java. Lecture 09. Network Programming
Java. Lecture 09. Network ProgrammingJava. Lecture 09. Network Programming
Java. Lecture 09. Network Programming
 
Msu.Center.Lectures.J09 Network Programming
Msu.Center.Lectures.J09 Network ProgrammingMsu.Center.Lectures.J09 Network Programming
Msu.Center.Lectures.J09 Network Programming
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
 
Сокеты
СокетыСокеты
Сокеты
 
Cassandra db
Cassandra dbCassandra db
Cassandra db
 
Инфрраструктура ЦОД - интерконнект от Qlogik
Инфрраструктура ЦОД - интерконнект от QlogikИнфрраструктура ЦОД - интерконнект от Qlogik
Инфрраструктура ЦОД - интерконнект от Qlogik
 
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетикеАлександр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
 
Принципы работы интернет.
Принципы работы интернет. Принципы работы интернет.
Принципы работы интернет.
 
Web лекция 1
Web   лекция 1Web   лекция 1
Web лекция 1
 
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
 
Web весна 2012 лекция 3
Web весна 2012 лекция 3Web весна 2012 лекция 3
Web весна 2012 лекция 3
 
C++ Базовый. Занятие 13.
C++ Базовый. Занятие 13.C++ Базовый. Занятие 13.
C++ Базовый. Занятие 13.
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
 
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
 
MUM Построение сети доступа на основе технологий DHCP + Radius на Mikrotik
MUM Построение сети доступа на основе технологий DHCP + Radius на Mikrotik MUM Построение сети доступа на основе технологий DHCP + Radius на Mikrotik
MUM Построение сети доступа на основе технологий DHCP + Radius на Mikrotik
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
 
SAP hands on lab_ru
SAP hands on lab_ruSAP hands on lab_ru
SAP hands on lab_ru
 
Qlogic: Технологии Ethernet
Qlogic: Технологии EthernetQlogic: Технологии Ethernet
Qlogic: Технологии Ethernet
 
Функциональные сети на основе библиотеки SynapseGrid
Функциональные сети на основе библиотеки SynapseGridФункциональные сети на основе библиотеки SynapseGrid
Функциональные сети на основе библиотеки SynapseGrid
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
 

More from Dima Dzuba

Объектно-ориентированное программирование. Лекции 15 и 16
Объектно-ориентированное программирование. Лекции 15 и 16Объектно-ориентированное программирование. Лекции 15 и 16
Объектно-ориентированное программирование. Лекции 15 и 16Dima Dzuba
 
Объектно-ориентированное программирование. Лекции 13 и 14
Объектно-ориентированное программирование. Лекции 13 и 14Объектно-ориентированное программирование. Лекции 13 и 14
Объектно-ориентированное программирование. Лекции 13 и 14Dima Dzuba
 
Объектно-ориентированное программирование. Лекции 11 и 12
Объектно-ориентированное программирование. Лекции 11 и 12Объектно-ориентированное программирование. Лекции 11 и 12
Объектно-ориентированное программирование. Лекции 11 и 12Dima Dzuba
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Dima Dzuba
 
Requirement modelling in software creation process
Requirement modelling in software creation processRequirement modelling in software creation process
Requirement modelling in software creation processDima Dzuba
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Dima Dzuba
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Dima Dzuba
 
Модифицируемость программных систем
Модифицируемость программных системМодифицируемость программных систем
Модифицируемость программных системDima Dzuba
 
Производительность программных систем
Производительность программных системПроизводительность программных систем
Производительность программных системDima Dzuba
 
Проектирование Программных Систем. Лекция 01
Проектирование Программных Систем. Лекция 01Проектирование Программных Систем. Лекция 01
Проектирование Программных Систем. Лекция 01Dima Dzuba
 
МАИ, Сети ЭВМ, Лекция №7
МАИ, Сети ЭВМ, Лекция №7МАИ, Сети ЭВМ, Лекция №7
МАИ, Сети ЭВМ, Лекция №7Dima Dzuba
 
Решение конфликтов в процессе проектирования сложных систем
Решение конфликтов в процессе проектирования сложных системРешение конфликтов в процессе проектирования сложных систем
Решение конфликтов в процессе проектирования сложных системDima Dzuba
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
Arch intro4sts
Arch intro4stsArch intro4sts
Arch intro4stsDima Dzuba
 
Проектирование программных систем. Занятие 10
Проектирование программных систем. Занятие 10Проектирование программных систем. Занятие 10
Проектирование программных систем. Занятие 10Dima Dzuba
 
Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9Dima Dzuba
 
Проектирование программных систем. Занятие 8
Проектирование программных систем. Занятие 8Проектирование программных систем. Занятие 8
Проектирование программных систем. Занятие 8Dima Dzuba
 
Проектирование программных систем. Занятие 7
Проектирование программных систем. Занятие 7Проектирование программных систем. Занятие 7
Проектирование программных систем. Занятие 7Dima Dzuba
 
Проектирование программных систем. Занятие 6
Проектирование программных систем. Занятие 6Проектирование программных систем. Занятие 6
Проектирование программных систем. Занятие 6Dima Dzuba
 

More from Dima Dzuba (20)

Объектно-ориентированное программирование. Лекции 15 и 16
Объектно-ориентированное программирование. Лекции 15 и 16Объектно-ориентированное программирование. Лекции 15 и 16
Объектно-ориентированное программирование. Лекции 15 и 16
 
Объектно-ориентированное программирование. Лекции 13 и 14
Объектно-ориентированное программирование. Лекции 13 и 14Объектно-ориентированное программирование. Лекции 13 и 14
Объектно-ориентированное программирование. Лекции 13 и 14
 
Объектно-ориентированное программирование. Лекции 11 и 12
Объектно-ориентированное программирование. Лекции 11 и 12Объектно-ориентированное программирование. Лекции 11 и 12
Объектно-ориентированное программирование. Лекции 11 и 12
 
Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10Объектно-ориентированное программирование. Лекции 9 и 10
Объектно-ориентированное программирование. Лекции 9 и 10
 
Requirement modelling in software creation process
Requirement modelling in software creation processRequirement modelling in software creation process
Requirement modelling in software creation process
 
Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8. Объектно-ориентированное программирование. Лекция 7 и 8.
Объектно-ориентированное программирование. Лекция 7 и 8.
 
Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6Объектно-ориентированное программирование. Лекция 5 и 6
Объектно-ориентированное программирование. Лекция 5 и 6
 
Модифицируемость программных систем
Модифицируемость программных системМодифицируемость программных систем
Модифицируемость программных систем
 
Производительность программных систем
Производительность программных системПроизводительность программных систем
Производительность программных систем
 
Проектирование Программных Систем. Лекция 01
Проектирование Программных Систем. Лекция 01Проектирование Программных Систем. Лекция 01
Проектирование Программных Систем. Лекция 01
 
МАИ, Сети ЭВМ, Лекция №7
МАИ, Сети ЭВМ, Лекция №7МАИ, Сети ЭВМ, Лекция №7
МАИ, Сети ЭВМ, Лекция №7
 
Решение конфликтов в процессе проектирования сложных систем
Решение конфликтов в процессе проектирования сложных системРешение конфликтов в процессе проектирования сложных систем
Решение конфликтов в процессе проектирования сложных систем
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
Arch intro4sts
Arch intro4stsArch intro4sts
Arch intro4sts
 
Проектирование программных систем. Занятие 10
Проектирование программных систем. Занятие 10Проектирование программных систем. Занятие 10
Проектирование программных систем. Занятие 10
 
Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9
 
Проектирование программных систем. Занятие 8
Проектирование программных систем. Занятие 8Проектирование программных систем. Занятие 8
Проектирование программных систем. Занятие 8
 
Проектирование программных систем. Занятие 7
Проектирование программных систем. Занятие 7Проектирование программных систем. Занятие 7
Проектирование программных систем. Занятие 7
 
Проектирование программных систем. Занятие 6
Проектирование программных систем. Занятие 6Проектирование программных систем. Занятие 6
Проектирование программных систем. Занятие 6
 

МАИ, Сети ЭВМ, Лекция №3

  • 1. МАИ, каф 806, Сети ЭВМ Программируем сокеты 1
  • 2. МАИ, каф 806, Сети ЭВМ 2 Сокеты Сокет –специальный дескриптор файла, для взаимодействия с сетью (термин произошел из UNIX). Работает напрямую с транспортным уровнем стека TCP/IP. Два типа сокетов:  Сервис с соединением (на базе TCP).  Сервис без соединения (на базе UDP). a.
  • 3. МАИ, каф 806, Сети ЭВМ Сокеты с соединениемпротокол TCP Сервис с соединением Гарантированная доставка Сохраняет последовательность переданных сообщений Управление диалогом (можно передавать и получать данные тогда когда нам удобно) Не очень быстрый Сокеты Беркли могут работать в одном из двух режимов: блокирующем или неблокирующем. Блокирующий сокет не возвращает контроль пока не отошлет (или пока не получит) все данные, указанные для операции. 3
  • 4. МАИ, каф 806, Сети ЭВМ Потоки В общем случае при передаче данных в сеть (и соответственно при приеме) мы будем работать с сетью как с файлами. Мы будем писать и считывать данные «поточным» образом. Т.е. сеть для нас будет своего рода очередью. Важно понимать, что поскольку данные передаются пакетами, то перед отправкой происходит группировка данных. Таким образом, данные отправляются в сеть не сразу, а в некоторый (случайный для верхнего слоя протокола) момент. Можно управлять отправкой данных принудительно отправив буфер в сеть. 4
  • 5. МАИ, каф 806, Сети ЭВМ 5 Сокеты с соединением. Клиентское приложениеСерверное приложениеКлиентский сокетПоток получения данныхПоток отправки данныхСерверный сокетКлиентский сокетПоток отправки данныхПоток получения данныхВиртуальный диалогДанные соединенияСлужебные данныеПользовательские данныеПользовательские данные
  • 6. МАИ, каф 806, Сети ЭВМ В терминах C# В момент работы метода accept происходит «зависание» сервера в ожидании входящего соединения. 6
  • 7. МАИ, каф 806, Сети ЭВМ Базовые классы005_Address System.Net.IPAddress http://msdn.microsoft.com/ru- ru/library/system.net.ipaddress.aspx  Конструкторы •Byte[] •Int64  Статические свойства •Any •Broadcast •Loopback •None  Методы •Parse (статический). •TryParse (статический) •ToString IPAddress test1 = IPAddress.Parse("192.168.1.1"); IPAddress test2 = IPAddress.Loopback; IPAddress test3 = IPAddress.Broadcast; IPAddress test4 = IPAddress.Any; IPAddress test5 = IPAddress.None; IPHostEntry ihe = Dns.GetHostEntry(Dns.GetHostName()); 7
  • 8. МАИ, каф 806, Сети ЭВМ Базовые классы006_EndPoint System.Net.IPEndPoint http://msdn.microsoft.com/ru- ru/library/system.net.ipendpoint.aspx  Конструкторы •IPEndPoint(IPAddress, Int32)  Статические свойства •MaxPort •MinPort  Свойства •Address •AddessFamily •Port IPHostEntry ihe = Dns.GetHostEntry(Dns.GetHostName()); IPAddress test1 = ihe.AddressList[0]; IPEndPoint ie = new IPEndPoint(test1, 8000); 8
  • 9. МАИ, каф 806, Сети ЭВМ 9 Сокеты с соединением. С#.Базовые классы 1.using System; 2.using System.Net; 3.namespace _06_EndPoint 4.{ 5.class Program 6.{ 7.static void Main(string[] args) 8.{ 9.IPAddress test1 = IPAddress.Parse("192.168.1.1"); 10.IPEndPoint ie = new IPEndPoint(test1, 8000); 11.Console.WriteLine("The IPEndPoint is: {0}",ie.ToString()); 12.Console.WriteLine("The AddressFamily is: {0}",ie.AddressFamily); 13.Console.WriteLine("The address is: {0}, and the port is: {1}n", ie.Address, ie.Port); 14.Console.WriteLine("The min port number is: {0}",IPEndPoint.MinPort); 15.Console.WriteLine("The max port number is: {0}n",IPEndPoint.MaxPort); 16.ie.Port = 80; 17.Console.WriteLine("The changed IPEndPoint value is: {0}", ie.ToString()); 18.SocketAddress sa = ie.Serialize(); 19.Console.WriteLine("The SocketAddress is: {0}", sa.ToString()); 20.} 21.} 22.}
  • 10. МАИ, каф 806, Сети ЭВМ 10 Сокеты с соединением. С#. Сервер. Базовые классы  System.Net.IPEndPoint  System.Net.IPAddress  System.Net.Sockets.Socket Сценарий  Создание точки подсоединения  Создание сокета  Связывание точки подсоединения и сокета  Ожидание соединения  Соединение с клиентом  Отправка/передача данных  Завершение сеанса связи с клиентом  Завершение ожидания подсоединения.
  • 11. МАИ, каф 806, Сети ЭВМ 11 Сокеты с соединением. С#. Сервер. немного UML sd C# СерверПрограмма Сервер:IPEndPoint:Socket:Socketloop Последовательность определяется прикладным протоколомloop Пока реаботает серверbind() listen() Accept() SocketReceive() Send() Shutdown() Close() Close()
  • 12. МАИ, каф 806, Сети ЭВМ 12 Сокеты с соединением. С#. Клиент. Базовые классы  System.Net.IPEndPoint  System.Net.IPAddress  System.Net.Sockets.Socket Сценарий  Создание точки подсоединения  Создание сокета  Связывание точки подсоединения и сокета  Соединение с сервером  Отправка/передача данных  Завершение сеанса связи с сервером
  • 13. МАИ, каф 806, Сети ЭВМ 13 Сокеты с соединением. С#. Клиентнемного UML sd С# КлиентПрограмма Клиент:IPEndPoint:Socketloop Последовательность определяется прикладным протоколомConnect() Send() Receive() Shutdown() Close()
  • 14. МАИ, каф 806, Сети ЭВМ Пример использование TCP Socket [1/2] .NET Framework privatestaticvoidOnBeginAccept(IAsyncResultar) { Socketlistener=(Socket)ar.AsyncState; using(Socketclient=listener.EndAccept(ar)) { byte[]buffer=newbyte[_bufferSize]; client.Receive(buffer); buffer=Encoding.UTF8.GetBytes(string.Format("Hello,{0}", Encoding.UTF8.GetString(buffer))); client.Send(buffer); } } 14
  • 15. МАИ, каф 806, Сети ЭВМ Пример использование TCP Socket [2/2] .NET Framework staticvoidMain(string[]args) { EndPointendPoint=newIPEndPoint(IPAddress.Loopback,8320); using(Socketlistener=newSocket(endPoint.AddressFamily,SocketType.Stream,ProtocolType.Tcp)) using(Socketclient=newSocket(endPoint.AddressFamily,SocketType.Stream,ProtocolType.Tcp)) { listener.Bind(endPoint); listener.Listen(1); listener.BeginAccept(newAsyncCallback(OnBeginAccept),listener); client.Connect(endPoint); Console.Write("Введитесообщение:"); stringrequest=Console.ReadLine(); intcount=client.Send(Encoding.UTF8.GetBytes(request)); byte[]buffer=newbyte[_bufferSize]; client.Receive(buffer); stringresponse=Encoding.UTF8.GetString(buffer); intindex=response.IndexOf('0'); Console.WriteLine(string.Format("Ответсервера:{0}", response.Remove(index))); } } 15
  • 16. МАИ, каф 806, Сети ЭВМ Сокеты и безопасностьNegotiateStream-Клиент static void Main(string[] args) { TcpClient client = new TcpClient(); client.Connect("localhost", 4242); NegotiateStream kerb = new NegotiateStream(client.GetStream()); kerb.AuthenticateAsClient(CredentialCache.DefaultNetworkCredentials, @"stsddzuba", ProtectionLevel.EncryptAndSign, System.Security.Principal.TokenImpersonationLevel.Impersonation); StreamWriter writer = new StreamWriter(kerb); writer.WriteLine("Hello kerberized Server"); } 16
  • 17. МАИ, каф 806, Сети ЭВМ Сокеты и безопасностьNegotiateStream-Сервер static void Main(string[] args) { TcpListener listener = new TcpListener(4242); listener.Start(); TcpClient client = listener.AcceptTcpClient(); NegotiateStream kerb = new NegotiateStream(client.GetStream()); kerb.AuthenticateAsServer(CredentialCache.DefaultNetworkCredentials, ProtectionLevel.EncryptAndSign, TokenImpersonationLevel.Impersonation); Console.WriteLine("Client Identity: {0}", kerb.RemoteIdentity.Name); WindowsPrincipal principal = newWindowsPrincipal((WindowsIdentity)kerb.RemoteIdentity); Console.WriteLine("Is Admin? : {0}", principal.IsInRole(WindowsBuiltInRole.Administrator)); Thread.CurrentPrincipal = principal; DoSomethingOnlyUsersCanDo(); } [PrincipalPermission(SecurityAction.Demand, Role=@"Пользователи")] static void DoSomethingOnlyUsersCanDo() {Console.WriteLine("Users only");} 17
  • 18. МАИ, каф 806, Сети ЭВМ Сокеты без соединенияпротокол UDP Сервис без соединения (т.е. пересылаем автономные пакеты) Не гарантированная доставка. Не гарантированная последовательность. Очень быстрый Пример использования: при авторизации клиентов для работы с интернет (популярный протокол RADIUS реализован поверх UDP) 18
  • 19. МАИ, каф 806, Сети ЭВМ 19 Сокеты без соединения. C#. СерверПротокол UDP 1.using System; 2.using System.Net; 3.using System.Net.Sockets; 4.using System.Collections.Generic; 5.using System.Text; 6.namespace _08_UDPClient 7.{ 8.class Program 9.{ 10.static void Main(string[] args) 11.{ 12.int recv; 13.byte[] data = new byte[1024]; 14.IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050); 15.Socket newsock = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp); 16.newsock.Bind(ipep); 17.Console.WriteLine("Waiting for a client..."); 18.IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); 19.EndPoint Remote = (EndPoint)(sender); 20.recv = newsock.ReceiveFrom(data, ref Remote); 21.Console.WriteLine("Message received from {0}:", Remote.ToString()); 22.Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); 23.string welcome = "Welcome to my test server"; 24.data = Encoding.ASCII.GetBytes(welcome); 25.newsock.SendTo(data, data.Length, SocketFlags.None, Remote); 26.while (true) { 27.data = new byte[1024]; 28.recv = newsock.ReceiveFrom(data, ref Remote); 29.Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); 30.newsock.SendTo(data, recv, SocketFlags.None, Remote); 31.} 32.} 33.} 34.}
  • 20. МАИ, каф 806, Сети ЭВМ 20 Сокеты без соединения. C#. Broadcast сообщения 1.using System; 2.using System.Collections.Generic; 3.using System.Text; 4.using System.Net; 5.using System.Net.Sockets; 6.namespace _09_Broadcst 7.{ 8.class Program 9.{ 10.static void Main(string[] args) 11.{ 12.Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp); 13.IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 9050); 14.IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("192.168.1.255"), 9050); 15.string hostname = Dns.GetHostName(); 16.byte[] data = Encoding.ASCII.GetBytes(hostname); 17.sock.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Broadcast, 1); 18.sock.SendTo(data, iep1); 19.sock.SendTo(data, iep2); 20.sock.Close(); 21.} 22.} 23.}
  • 21. МАИ, каф 806, Сети ЭВМ Как передать данные на другой компьютер? Протокол данных TCP и UDP предоставляют сервис по передаче данных в виде последовательности байт. Как передать сложные структуры данных? Необходима реализация дополнительного слоя, предоставляющего сервис по преобразованию данных из нужного формата в поток байт и обратно. Как это сделать наиболее просто? 21
  • 22. МАИ, каф 806, Сети ЭВМ Как передать объект на другую машину? сериализацияв .NET В отличие от приложений на неуправляемом коде, приложения .NET Framework не обязательно выполняются в виде отдельных процессов, а могут существовать в пределах одного процесса операционной системы в своих собственных областях, называемых доменами приложения. Такие области можно рассматривать как некоторые логические процессы виртуальной машины CLR. При передаче между доменами приложений некоторого объекта для его класса должна быть определена процедура сериализации, которая позволяетсохранитьсостояние объекта в некотором внешнем хранилище (например, в файле, или в сообщении транспортного протокола) припомощипотоков ввода-вывода, и процедура десериализации, создающая копию объекта по сохраненному состоянию 22
  • 23. МАИ, каф 806, Сети ЭВМ А что если объект сложный? граф объектов Задача сериализации объекта, включающего только поля из элементарных типов значений (наследников классаSystem.ValueType) и строк, не представляет принципиальных трудностей. Для такого объекта в ходе сериализации в поток записываются сами значения всех полей объекта. Однако в общем случае объект содержит ссылки на другие объекты, которые, в свою очередь, могут ссылаться друг на друга, образуя так называемый граф объектов (object graph). 23 public class SampleClass { public SampleClassfieldA= null; public SampleClassfieldB= null; } ... SampleClassroot = new SampleClass(); SampleClasschild1 = new SampleClass(); SampleClasschild2 = new SampleClass(); root.fieldA= child1; root.fieldB= child2; child1.fieldA = child2;
  • 24. МАИ, каф 806, Сети ЭВМ Просто пронумеруем объектыпочти как ссылки в C++ ObjectID ? В ходе сериализации объектам должны быть поставлены в соответствие некоторые идентификаторы, и в хранилище отдельно сохраняется список объектов, отмеченный идентификаторами, а при сериализации вместо ссылок записываются идентификаторы ссылаемых объектов. Виртуальный адрес! В программе роль идентификатора объекта выполняет его адрес, но вместо него обычно удобнее назначить некоторые идентификаторы в процедуре сериализации для более легкого чтения человеком полученного образа. Hash-map … В ходе сериализации нужно ввести список адресов уже записанных объектов, как для ведения списка идентификаторов, так и для обнаружения возможных циклов при обходе графа методом в глубину. 24
  • 25. МАИ, каф 806, Сети ЭВМ .Net Frameworkчем нам поможет? В .NET Framework выделяется три различных независимых класса форматирования:  XmlSerializer  SoapFormatter  BinaryFormatter. Технологии технология веб служб ASP.NETиспользуетXmlSerializer; технология RemotingиспользуетSoapFormatter,BinaryFormatterили созданный пользователем класс; при работе с сообщениями MSMQиспользуетсяXmlSerializer(черезXMLMessageFormatter), илиBinaryFormatter(через BinaryMessageFormatter), или созданный пользователем класс; технология Enterprise Services основана на Remoting и используетBinaryFormatter. 25
  • 26. МАИ, каф 806, Сети ЭВМ System.Xml.XmlSerializer КлассXmlSerializerреализует открытый текстовый метод сериализации,использующийXML в качестве базового формата хранения и схемы XML для спецификации документа с результатом сериализации. Начиная с .NET Framework2.0XmlSerializerпозволяет сериализоватьпубличные классы, имеющие конструктор без параметров типаpublicи отвечающие одному из следующих требований: Класс реализует интерфейсIXMLSerializable. В этом случаеXmlSerializerпросто использует при сериализацииметоды классаGetSchema,ReadXml,WriteXml. Класс реализует интерфейсSystem.Collections.IEnumerable, но не реализуетICollectionи содержит публичный методAddc единственным параметром, имеющим тип, совпадающий с типом результатасвойстваIEnumerator.CurrentметодаGetEnumeratorсериализуемогообъекта. Такой класс сериализуетсячерез вызовы классаIEnumerator, возвращаемого методомGetEnumerator, а его публичные поля и свойства не сериализуются. Класс реализует интерфейсSystem.Collections.ICollection, но не реализуетIEnumerable. Для такого класса осуществляется сериализациятолько свойстваItemи публичных полей, реализующих интерфейсICollection. Другие публичные поля и свойства не сериализуются. Класс реализует интерфейсыICollectionиIEnumerable, имеет публичное индексированное свойствоItemc целым индексом и публичное целое свойствоCount. Тип, принимаемый методомAdd, должен быть типом свойстваItemили одним из его предков. Другие публичные поля и свойства не сериализуются. Класс не реализует ни один из интерфейсовIXMLSerializer,IEnumerable,ICollectionи имеет атрибутSystem.SerializableAttribute. В этом случае будут сериализованыпубличные свойства и поля класса с учетом специальных атрибутов, управляющих процессом сериализации.  Подлежащие сериализациипубличные свойства должны иметь реализацию обоих методов,getиset. Кроме того, если класс не использует собственную процедуру сериализации, то он не должен иметь свойств или полей типа интерфейс или многомерных массивов, вместо них следует использовать вложенные массивы. 26
  • 27. МАИ, каф 806, Сети ЭВМ Работа с XSD схемами В состав .NET Framework входит утилитаxsd.exe, позволяющая выполнять три основные задачи: создание частичного (partial) описания класса на С# по схеме XSD; создание схемы XSD по классу С#; создание схемы XSD по образцу XML-файла (правильность зависит от полноты образца). Формат: xsd.exe assembly/type:type_name Таким образом, прииспользованиидля обмена данными между компонентами классаXmlSerializerможно как создать схему по сериализуемому классу и представить ее в качестве спецификации передаваемых данных, так и сгенерировать на языке C# код описания публичных свойств класса из XSD-схемы. 27
  • 28. МАИ, каф 806, Сети ЭВМ XmlSerializerитого Особенностью классаXMLSerializerявляется то, что в ходе работы он создает сборки с кодом сериализации для каждого обрабатываемого класса при вызове его конструктора. Если такая задержка нежелательна (например, программа не совершает повторяющейся сериализации одного и того же класса, но желает при этом осуществлять операции максимально быстро), то при помощи утилиты sgen.exe можно заранее создать такие сборки и затем подключить их к проекту. Резюмируя краткое описаниеXMLSerializer, следует отметить, что несмотря на отдельные сложности его применения к некоторым классам, его использование позволяет создать открытое взаимодействия удаленных компонент со спецификацией сериализуемых классов в виде схемы XSD. 28
  • 29. МАИ, каф 806, Сети ЭВМ System.Runtime.Serialization.Formatters.Soap.SoapFormatterSystem.Runtime.Serialization.Formatters.Binary.BinaryFormatter Класс форматированияBinaryFormatterреализует двоичный закрытый метод сериализации. КлассSoapFormatter–текстовый и открытый, основанный на спецификации кодирования SOAP-RPC Оба указанных класса в простейшем случае при сериализации сохраняют все поля класса (но не его свойства), вне зависимости от их видимости. Поля, имеющие атрибутSystem.NonSerializeAttribute, игнорируются. Класс должен иметь атрибутSystem.SerializableAttribute. Если же обрабатываемый класс реализует интерфейсISerializable:  он сериализуется вызовом GetObjectData(SerializationInfo info, StreamingContext context)  десериализация таких классов осуществляется вызовом конструктораISerializable(SerializationInfo info, StreamingContext context) 29
  • 30. МАИ, каф 806, Сети ЭВМ SOCKET java 30
  • 31. МАИ, каф 806, Сети ЭВМ 31 Сокеты с соединениемна примере JAVA Носитель Информации java.io.OutputStream Буфер write Байт java.io.InputStream read Байт Байт Байт flush
  • 32. МАИ, каф 806, Сети ЭВМ 32 Носитель Информации Потокив JavaПаттерн Decorator Базовые интерфейсы  InputStream  OutputStream Потоки-декораторы  BufferedInputStream  BufferedOutputStream  DataInputStream  DataOutputStream  ObjectInputStream  ObjectOutputStream  PrintStream Простые потоки  FileInputStream  FileOutputStream  ByteArrayInputStream  ByteArrayOutputStream Носитель Информации Поток-Модификатор Метод Доступа потока-декоратора Метод Доступа потока Метод Доступа потока-декоратора Метод приложения пользователя
  • 33. МАИ, каф 806, Сети ЭВМ 33 Сокеты с соединением Java. Базовые классы java.net.InetAddress  Конструкторы –нет  Статические методы •getLocalHost •getByName •getAllByName  Пример 1.import java.net.*; 2.classInetAddressTest 3.{ 4.publicstaticvoidmain(Stringargs[]) throwsUnknownHostException 5.{ 6.InetAddress Address = InetAddress.getLocalHost(); 7.System.out.println(Address); 8.Address = InetAddress.getByName("www.soshnikov.com"); 9.System.out.println(Address); 10.InetAddress SW[] = InetAddress.getAllByName("www.mai.ru"); 11.for(inti=0; i<SW.length; i++) 12.System.out.println (SW[i]) ; 13.} 14.}
  • 34. МАИ, каф 806, Сети ЭВМ 34 Сокеты с соединением. Java. Сервер. Базовые классы  java.net.Socket  java.net.ServerSocket  java.io.InputStream  java.io.OutputStream Сценарий  Создание сокета  Ожидание соединения  Соединение с клиентом  Создание объектов-потоков  Отправка/передача данных  Удаление объектов-потоков  Завершение сеанса связи с клиентом  Завершение ожидания подсоединения.
  • 35. МАИ, каф 806, Сети ЭВМ 35 Сокеты с соединением. Java. Сервер. 1.importjava.net.*; 2.importjava.io.*; 3.publicclassServerExample 4.{ 5.publicstaticvoidmain(Stringargv[]) 6.{ 7.try{ 8.ServerSocket server= newServerSocket(2345); 9.while(true) 10.{ 11.Socket client = server.accept(); 12.OutputStream os = client.getOutputStream(); 13.os.write("Hello World!".getBytes()); 14.os.flush(); 15.client.close(); 16.} 17.} catch(IOException e) 18.{ 19.} 20.} 21.}
  • 36. МАИ, каф 806, Сети ЭВМ 36 Сокеты с соединением. Java. Клиент. Базовые классы  java.net.Socket  java.net.InetAddress  java.io.InputStream  java.io.OutputStream Сценарий  Создание адреса  Создание сокета  Соединение с сервером  Создание объектов-потоков  Отправка/передача данных  Удаление объектов-потоков  Завершение сеанса связи с сервером
  • 37. МАИ, каф 806, Сети ЭВМ 37 Сокеты с соединением. Java. Клиент. 1.importjava.net.*; 2.importjava.io.*; 3.publicclassClientExample 4.{ 5.publicstaticvoidmain(Stringargv[]) 6.{ 7.try{ 8.Socket client = new Socket(InetAddress.getLocalHost(),2048); 9.ObjectOutputStream os = new ObjectOutputStream(client.getOutputStream()); 10.ObjectInputStream is = new ObjectInputStream(client.getInputStream()); 11.os.write(“Hello server!”); 12.Object result = is.readObject(); 13.os.flush(); 14.client.close(); 15.} 16.} catch(Exception e) 17.{ 18.} 19.} 20.}
  • 38. МАИ, каф 806, Сети ЭВМ 38 Сокеты без соединения.Javaпротокол UDP Классы  java.net.DatagramSocket  java.net.DatagramPacket Пример: 1.bytebuffer[] = newbyte[1024]; 2.DatagramSocket ds = newDatagramSocket(1111); 3.ds.send(new DatagramPacket( buffer, buffer.length, InetAddress.getLocalHost(), 2222)); 4.DatagramPacket p = newDatagramPacket(buffer, buffer.length); 5.ds.receive(p); 6.System.out.println(new String(p.getData(),0,0,p.getLength())) ;
  • 39. МАИ, каф 806, Сети ЭВМ Библиотека java.nioнеблокирующие сокеты и цикличный буфер Классы  ServerSocketChannel  SocketChannel Использование ByteBufferbuffer = ByteBuffer.allocate(4096); ServerSocketChannelssc= ServerSocketChannel.open(); ssc.socket().bind(new InetSocketAddress(8080)); ssc.configureBlocking(false); … buffer.rewind(); sc.read(buffer) 39
  • 40. МАИ, каф 806, Сети ЭВМ Немного о проблемах написания высокопроизводительных серверов Большое количество клиентов, и большое количество запросов от клиентов требуют от сервера эффективности обработки запросов. Какие задачи выполняет сервер?  Получает запрос от клиента  Читает данные из сети  Выполняет вычисления  Отправляет данные клиенту Создавая много потоков (Thread) мы потребляем много ресурсов, что приводит к деградации производительности. Основные вопросы:  Размер пула потоков?  Один поток на каждого клиента?  Один поток на всех клиентов и много потоков обработчиков? 40