- •«Дальневосточный федеральный университет»
- •Школа естественных наук материалы практических занятий
- •Определение установок сетевого адаптера
- •2.3. Определение сетевого адреса и маски сети
- •Разграничение доступа к сетевым ресурсам
- •2.5. Проверка сетевого соединения в tcp/ip - сетях.
- •1. Теоретическое введение
- •Имена почтовых ящиков.
- •1.2. Сервер почтовых ящиков
- •1.3 Пример создания сервера почтовых ящиков
- •1.4. Клиент почтовых ящиков
- •1.5 Создания клиента почтовых ящиков
- •2. Задание по практическому занятию
- •2.1. Создание серверного приложения
- •1. Теоретическое введение
- •1.2. Процедуры и функции Win32 для работы с файлами
- •1.2.1. Создание или открытие файла
- •1.2.2. Запись в файл
- •1.2.3. Чтение из файла
- •1.2.4. Закрытие файла
- •1.3. Пример программы, использующей функции Win32 для доступа к файлам и каталогам
- •1.4. Функции Delphi для работы с файлами
- •1.4.1. Открытие и закрытие файла
- •1.4.2. Типы файлов
- •1.4.3. Обработка ошибок при работе с файлами в Delphi
- •1.5. Пример программы, использующей функции Delphi для доступа к файлам и каталогам
- •2. Задание по лабораторной работе
- •1. Теоретическое введение
- •Пример создания сервера именованных каналов, работающего в блокирующем режиме
- •Пример создания клиента именованных каналов
- •Задание по практическому занятию
- •Создание серверного приложения,
- •Создание клиентского приложения,
- •2.3. Расширение возможностей именованных каналов
- •1. Теоретическое введение
- •1.1. Особенности организации работы именованных
- •2. Задание по практическому занятию
- •2.1. Создание серверного приложения
- •2.2. Создание клиентского приложения
- •Занятие 6. Поиск доступных сетевых ресурсов
- •1. Теоретическое введение
- •Алгоритм поиска сетевых ресурсов
- •1.2. Структуры и функции для работы с сетевыми ресурсами
- •2.Задание по практическому занятию
- •1. Теоретическое введение
- •1.1. Назначение протокола NetBios
- •1.2. Назначение протокола NetBeui
- •2. Задание по практическому занятию
- •Занятие 8. СокетыWindows. Создание клиент-серверного приложения работающего по протоколуUdp
- •1. Теоретическое введние
- •1.1. Сокеты windows
- •1.2. Функции winsock для протокола udp
- •1.2.1. Инициализация интерфейса сокетов
- •1.2.2. Создание сокета
- •1.2.3. Определение номера порта и ip-адреса, по которому сервер будет принимать данные
- •1.2.4. Передача данных
- •2. Задание по практическому занятию
- •2.2. Создание клиентского приложения
- •2.3. Реализация возможностей функций Winsock по передаче данных между различными компьютерами в сети
- •Занятие 9. Исследование возможностей использования сокетов windows для организации обмена информацией между клиентом и сервером по протоколу тср
- •1. Теоретическое введение
- •1.1. Функции Winsock для протокола tcp
- •1.1.1. Установление соединения
- •1.1.3. Блокирование выполнения программы до тех пор, пока не поступит запрос на установление соединения
- •1.1.4. Передача данных
- •1.1.5. Получение данных по сети
- •1.2. Алгоритм работы Winsock- приложения по протоколу tcp
- •2. Задание по лабораторной работе
- •2.1. Создание серверного приложения
- •2.2. Создание клиентского приложения
- •2.3. Исследование возможностей функций Winsock по передаче данных между различными компьютерами в сети
- •Занятие 10. Исследование методов сканирования сети
- •1. Теоретическое введение
- •2.1. Создание многопоточного приложения для сканирования сети
- •2.2. Исследование различных методов сканирования сети
- •Занятие 11. Применение сокетного соединения для обеспечения сетевого взаимодействия клиента и сервера
- •1. Теоретическое введение
- •1.1. Компоненты Delphi, инкапсулирующие сокеты
- •1.2. Компоненты Delphi tcpserver и tcpcl1ent
- •1.2.1. Установление соединения
- •1.2.2. Синхронизация сокетов
- •1.2.3. Класс TserverWinsocket
- •1.2.4. Компонент TserverSocket
- •1.2.5. Класс tClientWinsocket
- •1.2.6. Компонент tClientSocket
- •2. Задание по практическому занятию
- •2.1. Создание серверного приложения
- •2.2. Создание клиентского приложения
- •1. Задание по лабораторной работе
- •1.1. Создание серверного приложения
- •1.2. Создание клиентского приложения
- •1.3. Исследование возможностей сервер-приложения
- •1. Теоретическое введение
- •2. Задание по практическому занятию
- •Занятие 14. Исследование возможностей поддержки протокола тср
- •1. Теоретическое введение
- •1.1. Методы indy-компонента- IdTcpClient
- •1.2. Методы indy-компонента - IdTcpServer
- •2. Задание по лабораторной работе
- •2.1. Создание серверного приложения
- •2.2. Создание клиентского приложения
- •Занятие 15. Программирование клиентских приложений для работы с серверами internet
- •1. Теоретическое введение
- •Библиотека WinInet
- •1.2. Функции библиотеки wininet
- •1.2.1. Функция создания сеанса связи InternetOpen
- •1.2.2. Функция установления url-соединения InternetOpenUrl
- •1.2.3. Функция чтения файла, находящегося на web-cepвepe InternetReadFile
- •1.2.4. Функция закрытия дескриптора – InternetCloscHandle
- •1.2.5. Функция установления соединения InternetConnect
- •1.2.6. Функция «Найти первое вхождение файла с указанным групповым именем» FtpFindFirstFile
- •1.2.7. Функция «Найти следующие вхождения файла с указанным групповым именем» InternetFindNextFile
- •1.2.8. Функция «Получить имя текущего Каталога на ftp-сервере» -FtpGetCurrentDirectory
- •1.2.9. Функция чтения файла с http-сервера FtpGetFile
- •2. Задание по практическому занятию
- •2.1. Создание клиентского приложения.
- •Занятие 16. Приём и передача файлов по сети с использованием протокола tftp
- •1. Теоретическое введение
- •1.1. Протокол tftp
- •1.2. Компонент- idTrivialFtp
- •Компонент IdTrivialFtpServer
- •2. Задание по практическому занятию
- •2.1. Создание серверного приложения
- •2.2. Создание клиентского приложения
- •Занятие 17. Создание http- клиента
- •1. Теоретическое введение
- •1.1. Свойства и методы компонента IdHttp
- •1.1.1. Метод get
- •1.1.2. Метод trace
- •1.1.3. Метод put
- •2. Задание по практическому занятию
- •2.1. Создание http-клиента
- •4. Как изменить приложение таким образом, чтобы файл с сервера записывался не в поле Memo, а в какой-либо файл на компьютере клиента? Каким должен быть тип переменной s в данном случае?
- •Тексты заданий самостоятельной работы задание № 1 создание web-браузера
- •1. Теоретическое введение
- •2. Задание по практическому занятию
- •Задание № 2 исследование telnet-клиента
- •1. Теоретическое введение
- •2. Задание по практическому занятию
- •2.1. Создание приложения Telnet-клиента
- •2.2. Исследование Telnet-клиента
- •Задание №3 разработка cgi-программ
- •1. Теоретическое введение
- •1.1. Принцип работы cgi-программ
- •1.2. Описание тега form
- •1.2.1. Тег input
- •1.2.2. Тег select
- •1.2.3. Тег textarea
- •13. Подтверждение и посылка запроса cgi-программе
- •2. Задание по практическому занятию
- •2.1. Создание простейшего серверного приложения
- •2.2. Передача cgi-приложению параметров, введенных пользователем, и получение дополнительной информации из переменных окружения
- •Задание № 4 разработка web-приложения
- •1. Теоретическое введение
- •1.1. Общее описание компонента twebmodule
- •1.2. Параметр request
- •1.3. Параметр response
- •1.4. События twebmodule
- •2. Задание по практическому занятию
- •2.1. Создание web-приложения с помощью компонента Delphi -webmodule
1.2.3. Класс TserverWinsocket
На уровне этого класса ведется список соединений с клиентскими сокетами, содержащийся в свойстве:
property Connections [Index: Integer]: TCustomWinsocket;.
Общее число соединений (и число элементов в свойстве Connection) равно значению свойства:
property ActiveConnections: Integer;.
Этими списком и счетчиком удобно пользоваться для рассылки всем клиентам какой-нибудь широковещательной информации, например:
for i := 0 to ServerSocket.Socket.ActiveConnections-l do ServerSocket.Socket.Connections[i].SendTеxt('Hi!');.
Тип сервера (блокирующий/неблокирующий) задается свойством
typeTServerType=(stNonBlocking, stThreadBlocking);
property ServerType: TServerType;.
Поскольку сервер, который блокируется каждым чтением/запись, представить себе трудно, разработчики фирмы Borland пошли таким путем. Блокирующий режим заменен режимом stThreadBlocking. В этом случае при установлении каждого нового соединения запускается отдельный программный поток (объект класса TServerClientThread). Он отвечает за связь с отдельным клиентом, и его блокировка не влияет на работу остальных соединений.
Если вы не хотите порождать объект класса TServerClientThread, а хотите описать свой класс потока и использовать его для работы с сокетом, нужно создать обработчик- события:
type TGetThreadEvent=procedure (Sender: TObject; ClientSocket: TServerClientWinsocket; var SocketThread: TServerClientThread)
of object;
property OnGetThread: TGetThreadEvent;.
В отличие от stThreadBlocking, тип stNonBlocking своим поведением ничем не отличается от рассмотренного выше операции происходят асинхронно, и программист должен лишь описать реакцию на события, возникающие в момент окончания операций.
Как известно, создание и уничтожение нового программного потока влекут за собой определенные системные накладные расходы. Чтобы избежать этого, в рассматриваемом классе поддерживается кэш потоков. По завершении соединения потоки не уничтожаются, а переводятся в состояние ожидания нового соединения.
Свойство
property ТhreadCacheSize: Integer;
задает количество свободных потоков, которые могут находиться в готовности для установления соединения с клиентом. Это количество должно рассчитываться в зависимости от интенсивности и продолжительности контакта с клиентами. Лишние потоки поглощают системные ресурсы, в первую очередь память и процессорное время. Чтобы оптимизировать использование кэша свободных потоков, полезно поинтересоваться значением двух свойств.
property ActiveThreads: Integer:
property IdleThreads: Integer;,
показывающих число активных (запитых обслуживанием клиентов) и простаивающих (ожидающих) потоков соответственно.
Старт и завершение потока, работающего c сокетом, обрамлены событиями:
type TthreadNotifyEvent=proсedure (Sender: TObject;
Thread: TServerClientThread) of object;
property OnThreadStart: TThreadNotifyEvent;
property OnThreadEnd: TThreadNotifyEvent;.
Конкурирующие за тот или иной системный ресурс потоки могут создавать проблемы при совместном доступе. Чтобы избежать этого, при работе с сокетами имеются два метода:
procedure Lock;
procedure Unlock;.
Если у нас предусмотрен код, который может вызвать проблемы в многозадачной среде, заключите его между вызовами методов Lock и Unlock -на это время остальные потоки, работающие с сокетами, будут блокированы.
Методы чтения и записи для блокирующего и неблокирующего режимов существенно отличаются.
Рассмотрим сначала те, что предназначены для неблокирующего (асинхронного) режима. Средства для организации чтения представлены группой из трех методов:
function RcceiveLength: integer; возвращает число байтов, которые могут быть приняты в ответ на оповещение клиента о передаче;
function ReceiveText: string; - возвращает прочитанную из cокета текстовую строку;
function RecetveBuf (var Buf; Count: integer): integer; - возвращает данные, прочитанные из cокета в буфер Buf, в количестве Count байтов.
Аналогично методы:
function SendBuf (var Buf; Count: Integer): integer;
procedure SendText (const S: string);
function SendStream (AStream-. TStream): boolean;
посылают клиенту буфер, текстовую строку и поток данных. В дополнение к этому, метод function SendStreamThenDrop (AStream: TStream): Boolean; - посылает клиенту поток данных и завершает соединение.
Передаваемый в качестве параметра последних двух функций поток данных AStream переходит «под надзор» объекта класса TServerWinsocket и удаляется им по мере пересылки. Программист не должен предпринимать попыток удалить AStream после вызова методов SendSream или SendSrteamThenDrop.
При помощи метода
function GetClientThread(ClientSocket: TServerClientWinsocket): I ServefClientThread;
можно получить указатель па ноток, занимающийся обслуживанием конкретного сокета. События:
property OnClientConnect;
properly OnClientDisconnect;
property OnClientRead;
property OnClientWrite;
имеют одинаковый тип
rSockеtNotifyEvent = procedure (Sender; TObject; Socket: TCustomWinsocket) of object;.
Они происходят при соединении-отключении от клиента, а также при чтении и записи. Появление ошибки вызывает событие;
TErrorEvent=(eeGeneral, eeSend, eeReceive, eeCotnnect, ecDisconnect,
eeAccept);
TSocketErrorEvent=proeedure (Sender: TObject; Socket:
TCustomWinsocket; ErrorEvent: TErrorEvent; var ErrorCode: integer)
of object;
property OnClientError: TSocketErrorEvent;.
Параметры его имеют следующее назначение. ErrorEvent - указывает на тип операции, во время которой произошла ошибка. При этом ЕrrorCode содержит код ошибки Windows. Если Вы обработали ошибку и не хотите дальнейших действий системы по ее обработке, нужно установить параметр ErrorCode в 0.
