Студопедия

Главная страница Случайная лекция


Мы поможем в написании ваших работ!

Порталы:

БиологияВойнаГеографияИнформатикаИскусствоИсторияКультураЛингвистикаМатематикаМедицинаОхрана трудаПолитикаПравоПсихологияРелигияТехникаФизикаФилософияЭкономика



Мы поможем в написании ваших работ!




Программирование обмена данными на основе транспортных протоколов

TCP должен взаимодействовать не только с протоколами нижележащего уровня, но и с протоколами и приложениями прикладного уровня. Связь с прикладным уровнем осуществляется с помощью набора сервисных примитивов. Сервисные примитивы определены в стандарте протокола, а для прикладных программ они доступны в форме библиотек работы с сокетами.

При установлении соединения каждая из сторон выполняет некоторые операции, называемые открытием соединения. Открытие может быть пассивным или активным. Как правило, одна из сторон производит активное открытие соединения, а другая – пассивное, тогда соединение устанавливается. Оба режима подчиняются четким правилам. Пассивное соединение еще иногда называют серверным, а активное – клиентским.

При активном соединении процесс прикладного уровня передает программному обеспечению TCP на той же ЭВМ сервисный примитив запроса на установление соединения с номером сокета, после чего TCP отправляет получателю запрос на установление соединения, затем ждет ответа. После установления соединения активный процесс (клиент) может инициировать прием или передачу данных.

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

Программный интерфейс сокетов изначально был разработан для операционной системы (ОС) UNIX. Библиотека функций, поддерживающих этот интерфейс, входит в ядро всех ОС типа UNIX и Linux. Однако принципы работы с этим программным интерфейсом применимы к большинству ОС, поддерживающих TCP/IP (например, в семействе ОС и оболочек типа Windows программный интерфейс сокетов реализован в динамической библиотеке Winsock.dll).

Для протокола TCP пассивное (на стороне сервера) соединение с сокетом приводит к выполнению следующих функций:

- создание сокета и установление его типа (в ОС типа UNIX функция socket);

- настройка сокета на конкретное соединение (указывает адрес и номер порта – в ОС типа UNIX – функция bind);

- создание очередей клиентов (в ОС типа UNIX – функция listen);

- ожидание приходящего запроса на соединение с сокетом (в ОС типа UNIX – функция accept);

- прием и передача данных от клиента (в ОС типа UNIX – функции read, write, send, recv и их модификации);

- закрытие соединения с клиентом (в ОС типа UNIX – функция close).

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

Для протокола TCP активное (на стороне клиента) соединение с сокетом приводит к выполнению следующих функций:

- создание сокета и установление его типа (в ОС типа UNIX функция socket);

- установление соединения с сервером (указывает адрес и номер порта – в ОС типа UNIX – функция connect);

- прием и передача данных (в ОС типа UNIX – функции read, write, send, recv и их модификации);

- закрытие соединения с сервером (в ОС типа UNIX – функция close).

Клиент, как правило, не требует для своей работы параллельного выполнения нескольких процессов.

В среде программирования Borland Delphi существуют специальные классы, которые позволяют выполнять те же действия, что и библиотека сокетов в ОС UNIX. Они взаимодействуют с библиотекой Winsock.dll на основе специальных технологий ОС (ActiveX технологии и COM-объекты). В среде Borland Delphi версии 3.0 для целей клиентского и серверного соединений служит класс объектов TTCP; а в среде Borland Delphi версии 5.0 и выше для клиентского соединения существует класс объектов TClientSocket, а для серверного – TServerSocket. Естественно, пользователь может на основе базовых классов разрабатывать свои собственные классы, которые будут поддерживать соединения по определенным им самим прикладным протоколам.

Для того чтобы создать сокет, достаточно создать экземпляр объекта выбранного класса (TTCP – в среде Borland Delphi версии 3.0 на страничке компонент «Internet», TClientSocket или TServerSocket – в среде Borland Delphi версии 5.0 и выше также на страничке компонент «Internet»). Это можно выполнить при проектировании приложения в среде разработки или же средствами языка программирования при выполнении приложения. Чтобы специфицировать (настроить) сокет, необходимо созданному экземпляру объекта присвоить нужные значения в указанные свойства (properties) – как правило, это свойства с именами вида «Port» и «Host» (имена и состав свойств зависят от версии среды разработки). Это тоже можно сделать как в режиме проектирования приложения, так и командами присвоения свойств объекта в тексте программы. После этого сокет инициализирован и с ним можно работать.

Для работы сокета клиента необходимо открыть сокет (процедура Open устанавливает в Thru свойство Active), затем использовать процедуры установления соединения, передачи и приема данных, а в конце работы закрыть сокет (процедура Close). При удалении экземпляра объекта автоматически прекратит существование и связанный с ним сокет. Краткое описание основных свойств, событий и методов объектов приведено в пункте 3.8 «Справочные данные».

По установлению соединения наступит событие, которое программист должен соответствующим образом обработать. В среде Borland Delphi версии 3.0 программист сам должен создавать потоки выполнения для обслуживания соединения (для выполнения потоков служат экземпляры класса объектов TThread), а в среде Borland Delphi версии 5.0 и выше это можно сделать в автоматическом режиме.

Более подробную информацию о функциях программного интерфейса с сокетами можно получить в справке соответствующей среды разработки или специализированной литературе.

3.6 Пример реализации простейшего клиент-серверного приложения на основе сокетов

Запустить Delphi. На пустой форме (возможен вариант совмещения функций клиента и сервера в одном приложении) разместить два компонента с закладки Internet: TClientSocket и TServerSocket (в 6 и 7 версии Delphi они могут отсутствовать; для установки надо выполнить шаги: Component – Install Packages – Add ­– dclsockets60.bpl или dclsockets70.bpl).

Для клиентской части программы понадобятся два компонента TEdit (один для ввода ip-адреса или dns-имени сервера, другой – для ввода передаваемой информации) и одна кнопка «Послать» для соединения с сервером и отправки ему сообщения.

Для серверной части понадобится один компонент TMemo для выдачи служебной информации о подключениях и отображения принимаемых сообщений).

В свойствах TServerSocket: установить Port в 4000, затем – Active в true.

В обработчике Button1Click написать код для соединения с сервером:

ClientSocket1.Host:=Edit1.Text;

ClientSocket1.Port:=4000;

ClientSocket1.Active:=true;

Теперь, при нажатии на Button1 произойдет соединение с сервером, адрес которого был указан в Edit1. При установлении соединения произойдет событие ClientSocket1.OnConnect, которое, например, надо обработать так, чтобы на сервер передавалась строка из Edit2 и происходило отсоединение:

Socket.SendText(Edit2.Text);

ClientSocket1.Active:=False;

При подключении клиента к ServerSocket1 произойдет событие ServerSocket1.OnClientConnect, в котором нужно вывести следующую информацию:

Memo1.Lines.Add('Client connected from: '+Socket.RemoteHost);

При попытке передать клиентом на сервер сообщение на сервере произойдет событие ServerSocket1.OnClientRead, в котором текст считывается и выводится в Memo1:

ReceivedString:=''; {локальная переменная типа string}

while Socket.ReceiveLength>0 do

ReceivedString:=ReceivedString+Socket.ReceiveText;

Memo1.Lines.Add('Received string: '+ReceivedString);

При отсоединении клиента произойдет событие OnClientDisconnect, в котором мы добавим в Memo1 соответствующее сообщение:

Memo1.Lines.Add('Client '+Socket.RemoteHost+' disconnected.');

Запустите проект и протестируйте его. В качестве ip-адреса можно использовать адреса соседних компьютеров, на которых запущены аналогичные программы или адрес 127.0.0.1 для тестирования на локальном компьютере.

Примечание: Оправка сообщений с сервера клиентам осуществляется с использованием тех же методов и событий соответственно на стороне сервера и клиентов. Отличие заключается в необходимости точного указания номера соединения в свойстве Connections[Index: Integer]: TcustomWinSocket. Например:

ServerSocket1.Socket.Connections[i].SendText('Test');

Здесь i = (0..N-1) – номер соединения, N – общее количество соединений.


<== предыдущая страница | следующая страница ==>
Логические соединения | Справочные данные. Основные свойства компонента ServerSocket

Дата добавления: 2015-07-26; просмотров: 211; Нарушение авторских прав




Мы поможем в написании ваших работ!
lektsiopedia.org - Лекциопедия - 2013 год. | Страница сгенерирована за: 0.003 сек.