Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Методы, которые реализуют API-интерфейс сокетов
Метод socket создает объект типа сокет и возвращает его: socket.socket(af, type, [protocol]) -> sock_obj Параметр af указывает, какое семейство протоколов будет использоваться с сокетом. Чаще всего используется значение AF_INET – домен Internet. Параметр type, указывает тип связи, который будет использоваться в сокете. Наиболее распространенными типами являются потоковая передача с установлением логического соединения (которая задается значением SOCK_STREAM) и блочная передача без установления логического соединения (которая задается значением SOCK_DGRAM). Дальнейшая работа с сокет-объектом проводится вызовом его методов. Метод close сообщает операционной системе, что программа завершила использование сокета. Вызов имеет форму: close() Сразу после создания сокет не имеет ни локального, ни удаленного адреса. В сервере для задания номера порта протокола, через который сервер будет принимать запросы на установление соединения, используется метод bind. Вызов метода bind имеет вид: bind(address) Вызов этой процедуры представляет собой запрос назначить сокету конкретный номер порта протокола. Параметр address здесь и далее в главе соответствует адресной информации, принятой в данной адресной семье. Для сокетов, работающих на основе IP, адрес – пара (host, port), где host указывает IP-адрес хоста, а port – порт. После задания номера порта протокола сервер должен передать операционной системе команду перевести сокет в пассивный режим, чтобы он мог применяться для получения запросов на установление соединения от клиентов. Для этого сервер вызывает метод listen, который принимает один параметр: listen( queuesize) Параметр queuesize указывает длину очереди запросов сокета. Сервер, в котором используется транспортный протокол с установлением логического соединения, должен выполнить метод accept для приема следующего запроса на установление соединения. Если в очереди находится хотя бы один запрос, метод accept немедленно выполняет возврат; если же в очередь не поступило ни одного запроса, то система блокирует сервер до тех пор, пока один из клиентов не сформирует запрос на установление соединения. Метод accept имеет следующую форму: accept() -> newsock, address Процедура accept создает новый сокет-объект для соединения и возвращает его, а так же адресную информацию о клиенте address вызывающей процедуре. Сервер использует новый сокет для обмена данными с клиентом и закрывает сокет после завершения работы. Первоначальный сокет сервера остается неизменным: после завершения обмена данными с клиентом, сервер использует первоначальный сокет для приема следующего запроса на установление соединения от клиента. В клиентских программах для установления соединения с конкретным сервером применяется метод connect. Вызов этого метода имеет форму: connect(address) Параметр address указывает адрес сервера. И клиенты, и серверы должны передавать информацию. Обычно клиент посылает запрос, а сервер возвращает ответ. Если сокет подключен, для передачи данных может применяться метод send. Метод send имеет два параметра, причем один из них необязательный: send(data[, flags]) -> bytes Параметр flags состоит из специальных констант, с помощью которых можно запрашивать специальные опции. Метод возвращает количество переданных байтов. Метод sendto позволяет клиенту или серверу передавать сообщение с использованием неподключенного сокета; он требуют указывать адрес назначения. Он имеет следующую форму: sendto(data[, flags], address) -> bytes Эта процедура отличается от процедуры send только последним параметром, который задает адрес назначения. И клиент, и сервер должны получать данные, переданные другим участником соединения. В API-интерфейсе сокетов предусмотрено несколько методов, которые могут использоваться для этой цели. Например, в приложении может быть выполнен метод recv для получения данных из подключенного сокета. Этот метод имеет следующую форму: recv(buffsize[, flags]) -> data Параметр buffsize определяет максимальный объем порции данных, получаемых за один вызов метода. Необязательный параметр flags аналогичен этому же параметру методов send и sendto. Метод возвращает данные, полученные из сокета. Если сокет не подключен, его можно использовать для получения сообщений от произвольного набора клиентов. В таких случаях система возвращает адрес отправителя наряду с каждым входящим сообщением: recvfrom(buffsize[, flags]) -> data, address Параметры соответствуют параметрам процедуры recv. Кроме данных, полученных из сокета, метод recvfrom регистрирует адрес отправителя точно в такой же форме, в какой его принимает метод sendto. Схема взаимодействия сервера с клиентом через интерфейс сокетов приведена на рисунке 2.2.
Задание к лабораторной работе Написать простейшее приложение клиент-сервер с одним сервером и одним клиентом используя API-интерфейс высокого уровня. Пример интерфейса приведен в приложении. Сервер начинает свою работу с ожидания запроса от клиента на соединение. Клиент устанавливает связь с сервером и посылает набор данных, введенный пользователем, на сервер. Сервер получает от клиента набор данных, выполняет указанные в варианте действия и возвращает клиенту результат. После этого сервер снова переходит в состояние ожидания запроса на соединение. Клиент, получив ответ с сервера, распечатывает его на экране и прекращает свою работу. Варианты заданий 1. Клиент пересылает серверу данные(строки текста). Сервер возвращает клиенту полученные данные, включив в конец каждого предложения количество символов в нем. 2. Клиент пересылает серверу данные(строки текста). Сервер изменяет порядок следования букв в полученном тексте на обратный и отправляет текст в таком виде клиенту. 3. Клиент пересылает серверу данные(строки текста). Сервер в полученном тексте в конец каждого предложения вставляет свой IP-адрес и номер порта и возвращает в таком виде данные клиенту. 4. Клиент пересылает серверу данные(строки текста). Сервер создает файл с уникальным именем, записывает в него полученные от клиента данные и в качестве результата обработки данных отправляет клиенту имя созданного файла. После получения ответа с сервера клиент распечатывает на экран содержимое указанного сервером файла. 5. Клиент пересылает серверу данные(строку и имя директории). Сервер находит все файлы в заданной директории, содержащие указанную строку и высылает их имена клиенту. 6. Клиент пересылает серверу имя некоторого файла. Сервер находит файл с указанным именем и пересылает его содержимое клиенту, либо сообщает клиенту, что файл с данным именем не найден. 7. Клиент пересылает серверу данные (имя директории). Сервер возвращает список файлов и поддиректорий данной директории(рекурсивно). Контрольные вопросы 1. Что представляет собой модель клиент-сервер? 2. Приведите общие особенности клиентских программ. 3. Приведите общие особенности серверных программ. 4. Приведите общую схему клиент-серверного взаимодействия. 5. В чем отличие взаимодействия клиента с сервером при использовании различных протоколов транспортного уровня, таких как TCP и UDP? В чем преимущества и недостатки каждого из протоколов? 6. Что такое сокет? Какие виды сокетов вам известны? 7. Опишите основные методы работы с сокетами. 8. Приведите схему взаимодействия клиента с сервером при использовании механизма сокетов. Лабораторная работа №3 Создание приложения интерактивной переписки. Цель работы Изучить основные принципы разработки многопользовательских приложений, построенных на основе технологии клиент-сервер с использованием протокола TCP/IP. Методические указания В лабораторной работе №2 было реализовано простейшее взаимодействие, в котором участвовали один клиент и один сервер. В данной лабораторной работе предлагается модифицировать программы таким образом, чтобы сервер мог осуществлять взаимодействие с несколькими клиентами сразу. Популярное:
|
Последнее изменение этой страницы: 2016-05-03; Просмотров: 858; Нарушение авторского права страницы