2. МАИ, каф 806, Сети ЭВМ 2
Сокеты
Сокет –специальный дескриптор файла, для взаимодействия с сетью (термин произошел из UNIX).
Работает напрямую с транспортным уровнем стека TCP/IP.
Два типа сокетов:
Сервис с соединением (на базе TCP).
Сервис без соединения (на базе UDP).
a.
3. МАИ, каф 806, Сети ЭВМ
Сокеты с соединениемпротокол TCP
Сервис с соединением
Гарантированная доставка
Сохраняет последовательность переданных сообщений
Управление диалогом (можно передавать и получать данные тогда когда нам удобно)
Не очень быстрый
Сокеты Беркли могут работать в одном из двух режимов: блокирующем или неблокирующем. Блокирующий сокет не возвращает контроль пока не отошлет (или пока не получит) все данные, указанные для операции.
3
4. МАИ, каф 806, Сети ЭВМ
Потоки
В общем случае при передаче данных в сеть (и соответственно при приеме) мы будем работать с сетью как с файлами.
Мы будем писать и считывать данные «поточным» образом. Т.е. сеть для нас будет своего рода очередью.
Важно понимать, что поскольку данные передаются пакетами, то перед отправкой происходит группировка данных. Таким образом, данные отправляются в сеть не сразу, а в некоторый (случайный для верхнего слоя протокола) момент.
Можно управлять отправкой данных принудительно отправив буфер в сеть.
4
5. МАИ, каф 806, Сети ЭВМ 5
Сокеты с соединением.
Клиентское приложениеСерверное приложениеКлиентский сокетПоток получения данныхПоток отправки данныхСерверный сокетКлиентский сокетПоток отправки данныхПоток получения данныхВиртуальный диалогДанные соединенияСлужебные данныеПользовательские данныеПользовательские данные
6. МАИ, каф 806, Сети ЭВМ
В терминах C#
В момент работы метода accept происходит «зависание» сервера в ожидании входящего соединения.
6
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
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
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.}
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