Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лр3_Удаленное взаимодействие_Сокеты.doc
Скачиваний:
7
Добавлен:
20.08.2019
Размер:
3.66 Mб
Скачать

1. Теоретическая часть.

1.1. Введение.

Как правило, в основе сетевой технологии используется механизм клиент-серверного взаимодействия. Клиент делает запрос на выполнение определенной операции, а сервер выполняет эту операцию и выдает клиенту ответ. Сетевые возможности языка С# сгруппированы в нескольких пространствах имен. Основные функции сетевой организации определены классами и интерфейсами пространства имен System.Net.Sockets. Данное пространство имен С# обеспечивает соединения на базе сокетов, что дает разработчикам возможность просматривать организацию сети в виде обычного файла ввода/вывода. Это означает, что программа может осуществлять считывание информации из сокета (сетевое соединение) и запись в сокет так же легко, как осуществляется считывание информации из обычного файла и запись в него. Использование сокетов это основополагающий способ сетевой организации в технологии .NET.

Классы и интерфейсы пространства имен System.Net.Sockets также предлагают соединения на основе пакетов, по которым передаются отдельные пакеты информации. Это - обычный способ передачи аудио- и видеоматериалов по интернету.

Соединения на базе сокетов в С# задействуют потоковые сокеты. С их помощью один процесс (выполняющаяся программа) устанавливает соединение с другим процессом. При наличии соединения обмен данными между процессами осуществляется в виде непрерывных потоков. По этой причине говорят, что потоковые сокеты обеспечивают службу маршализации. Популярный протокол TCP (протокол управления передачей) упрощает передачу информации по потоковым сокетам.

С другой стороны, соединения на базе пакетов в С# используют дэйтаграммные сокеты, по которым передаются отдельные пакеты информации. В отличие от TCP, протокол, используемый для активизации дэйтаграммных сокетов – UDP (пользовательски протокол данных) является службой, не зависящей от соединения и не гарантирующий передачу пакетов в каком-либо заданном порядке. Пакеты могут теряться, дублироваться или поступать без учета последовательности отправки. Для решения таких проблем приложения, использующие UDP, часто требуют значительной программной доработки. Лучше всего UDP подходит для сетевых соединений, не требующих проверки ошибок и надежности TCP.

1.2. Создание приложения сервера с помощью потоковых сокетов.

Организация серверного приложения с TCP и потоковыми сокетами в С# требует выполнения пяти шагов.

Первый шаг – это создание объекта класса TcpListener, принадлежащего пространству имен System.Net.Sockets. Данный класс представляет потоковый сокет TCP, с помощью которого сервер "прослушивает" запросы. Вызов конструктора TcpListener(), например, TcpListener server = new TcpListener(port);

связывает сервер с заданным номером порта. Номер порта – это числовой идентификатор, используемый процессом для самоидентификации на конкретном сетевом адресе, также называемом IP-адресом. С помощью IP-адресов компьютеры идентифицируются в интернете. На самом деле, названия Web-сайтов, например, www.rambler.ru, являются псевдонимами IP-адресов. Любой процесс, выполняющий сетевую обработку информации, самоидентифицируется через пару "IP-адрес/номер порта". Как правило, в явном связывании сокета с портом (с помощью метода Bind класса Socket) необходимости нет, потому что класс TcpListener и другие классы скрывают это связывание (т.е. связывают сокеты с портами неявно), а также выполняют другие операции по инициализации сокетов. Для получения запросов класс TcpListener сначала должен их прослушивать.

Вторым шагом процесса соединения является вызов метода Start() класса TcpListener, активизирующего начало прослушивания объектом TcpListener запросов на соединение.

Третий шаг устанавливает соединение между приложениями клиента и сервера. Сервер выполняет прослушивание на предмет появления запросов, т.е. исполнение серверного приложения ожидает попытки соединения со стороны клиента. При получении сервером запроса от клиенту он создает подключение к клиенту. Объект класса System.Net.Sockets.Socket управляет каждым соединением с клиентом. Метод AcceptSocket() класса TcpListener ожидает запроса на соединение и создает его при получении такого запроса. При наличии соединения данный метод возвращает объект типа Socket, как в следующем выражении:

Socket connection = server. AcceptSocket();

При получении сервером запроса метод AcceptSocket() вызывает метод Socket() класса TcpListener для установки соединения. Это – пример сокрытия в C# сложности сетевой организации от программиста. Последний может написать предшествующее выражение в серверной программе, после чего классы пространства имен System.Net.Sockets будут обрабатывать подробности приема запросов и установления соединений.

Четвертый шаг – Это фаза обработки, когда сервер и клиент взаимодействуют с помощью методов Receive и Send объекта типа Socket. Следует отметить, что эти методы можно использовать только при установленном соединении между клиентом и сервером. В противоположность этому UDP и дэйтаграммные сокеты можно использовать при отсутствии соединения с помощью методов SendTo() и ReceiveFrom() класса Socket.

Пятый шаг – это фаза прерывания соединения с клиентом. По окончании взаимодействия сервера с клиентом сервер использует метод Close() объекта класса Socket для разрыва соединения. После этого большинство серверов возвращается к шагу 2. (т.е. к ожиданию запроса на соединение с другим клиентом).