- •Работа с сокетами в Delphi
- •Установка компонентов
- •Работа с клиентскими сокетами (tClientSocket)
- •3) Отправка/прием данных.
- •Для приема или отправки данных необходимо использовать методы объекта tClientSocket.Socket:
- •Работа с серверными сокетами (tServerSocket)
- •Основные этапы работы с tServerSocket
- •Пример работы сокетами
Для приема или отправки данных необходимо использовать методы объекта tClientSocket.Socket:
SendBuf(var Buf; Count: Integer) - Посылка буфера через сокет. Буфером может являться любой тип, будь то структура (record), либо простой Integer. Буфер указывается параметром Buf, вторым параметром Вы должны указать размер пересылаемых данных в байтах (Count);
SendText(const S: string)- Посылка текстовой строки через сокет.
SendStream(AStream: TStream)- Посылка содержимого указанного потока через сокет. Пересылаемый поток должен быть открыт. Поток может быть любого типа - файловый, из ОЗУ, и т.д.
ReceiveBuf (var Buf; Count: Integer)- Прием данных в буферBuf, размеромCount. Важно знать, что при попытке чтения большего количества данных чем доступно на данный момент – возникнет ошибка чтения с сокета. Количество данных (в байтах), доступных для чтения с сокета, можно узнать в свойствеReceiveLength.
Для чтения простых данных с сокета можно воспользоваться свойством ReceiveText.
Работа с серверными сокетами (tServerSocket)
Сервер, основанный на сокетах, позволяет обслуживать сразу множество клиентов. Причем, ограничение на их количество вы можете указать сами (или вообще убрать это ограничение, как это сделано по умолчанию). Для каждого подключенного клиента сервер открывает отдельный сокет, по которому Вы можете обмениваться данными с клиентом.
Основные этапы работы с tServerSocket
1) Определение свойств Port и ServerType - чтобы к серверу могли нормально подключаться клиенты, нужно, чтобы порт, используемый сервером точно совпадал с портом, используемым клиентом (и наоборот). СвойствоServerTypeопределяет тип подключения (подробнее см.ниже);
2) Открытие сокета- открытие сокета и указанного порта. Здесь выполняется автоматическое начало ожидания подсоединения клиентов (Listen);
3) Подключение клиента и обмен данными с ним- здесь подключается клиент и идет обмен данными с ним.
4) Отключение клиента- Здесь клиент отключается и закрывается его сокетное соединение с сервером.
5) Закрытие сервера и сокета- По команде администратора сервер завершает свою работу, закрывая все открытые сокетные каналы и прекращая ожидание подключений клиентов.
Следует заметить, что пункты 3-4 повторяются многократно, т.е. эти пункты выполняются для каждого нового подключения клиента.
Основные свойства компонента TServerSocket | |
Socket |
Класс TServerWinSocket, через который Вы имеете доступ к открытым сокетным каналам. Далее мы рассмотрим это свойство более подробно, т.к. оно, собственно и есть одно из главных. |
ServerType |
Тип сервера. Может принимать одно из двух значений: stNonBlocking- синхронная работа с клиентскими сокетами. При таком типе сервера Вы можете работать с клиентами через событияOnClientReadиOnClientWrite.stThreadBlocking- асинхронный тип. Для каждого клиентского сокетного канала создается отдельный процесс (Thread). |
ThreadCacheSize |
Количество клиентских процессов (Thread), которые будут кэшироваться сервером. Здесь необходимо подбирать среднее значение в зависимости от загруженности Вашего сервера. Кэширование происходит для того, чтобы не создавать каждый раз отдельный процесс и не убивать закрытый сокет, а оставить их для дальнейшего использования. |
Active |
Показатель того, активен в данных момент сервер, или нет. Т.е., фактически, значение True указывает на то, что сервер работает и готов к приему клиентов, а False- сервер выключен. Чтобы запустить сервер, нужно просто присвоить этому свойству значениеTrue. |
Port |
Номер порта для установления соединений с клиентами. Порт у сервера и у клиентов должны быть одинаковыми. Рекомендуются значения от 1025 до 65535, т.к. от 1 до 1024 - могут быть заняты системой. |
Основные методы компонента TServerSocket | |
Open |
Запускает сервер. По сути, эта команда идентична присвоению значения TrueсвойствуActive |
Close |
Останавливает сервер. По сути, эта команда идентична присвоению значения FalseсвойствуActive |
Основные события компонента TServerSocket | |
OnClientConnect |
Возникает, когда клиент установил сокетное соединение и ждет ответа сервера (OnAccept) |
OnClientDisconnect |
Возникает, когда клиент отсоединился от сокетного канала |
OnClientRead |
Возникает, когда клиент передал серверу какие-либо данные. Доступ к этим данным можно получить через передаваемый параметр Socket: TCustomWinSocket |
OnClientWrite |
Возникает, когда сервер может отправлять данные клиенту по сокету |
OnGetSocket |
В обработчике этого события Вы можете отредактировать параметр ClientSocket |
OnGetThread |
В обработчике этого события Вы можете определить уникальный процесс (Thread) для каждого отдельного клиентского канала, присвоив параметру SocketThread нужную подзадачу TServerClientThread |
OnThreadStart |
Возникает, когда подзадача (процесс, Thread) запускается |
OnThreadEnd |
Возникает, когда подзадача (процесс, Thread) останавливается |
OnAccept |
Возникает, когда сервер принимает клиента или отказывает ему в соединении |
OnListen |
Возникает, когда сервер переходит в режим ожидания подсоединения клиентов |