12.09.2021 (Версия 3.1)
25.05.2021 (Версия 3.0)
13.03.2021 (Версия 2.6)
01.02.2021 (Версия 2.5)
18.12.2020 (Версия 2.4)
28.11.2020
31.10.2020 (Версия 2.3)
27.10.2020 (Версия 2.2)
26.10.2020 (Версия 2.1)
09.10.2020
06.10.2020
24.09.2020
16.07.2020
12.07.2020
03.05.2020
19.04.2020
31.03.2019
Эти компоненты позволяют установить асинхронную связь TCP Socket между компьютерами в сети LAN или в Интернете.
DzTCPServer и DzTCPClient используют TClientSocket и TServerSocket модуля System.Win.ScktComp. Эти классы доступны в Delphi, но их немного сложно реализовать, поскольку вам нужно читать и записывать данные буфера, а доступных ресурсов не так много.
Использование очень простое. Вам нужно будет переместить серверный компонент в серверное приложение и клиентский компонент в клиентское приложение и начать кодировать командные сообщения.
Вы можете делать много вещей, например приложение чата, приложение удаленных команд, приложение удаленного мониторинга и даже отправлять потоки, такие как файлы. Небо – это предел.
Структура кэша : когда вы используете собственный компонент сокета Delphi. Если вы отправляете несколько сообщений одновременно, получатель может получать сообщения сгруппированными или разделенными, поэтому вам всегда нужно решать эту проблему. DzSocket автоматически управляет сообщениями сокетов, поэтому вы всегда получаете одно событие на каждое сообщение.
KeepAlive : когда вы устанавливаете сокетное соединение, если одна сторона соединения потеряна, другая сторона не будет передаваться до тех пор, пока не будет предпринята попытка отправки нового сообщения. Таким образом, вы можете реализовать ручной пинг, но это потребует много лишней работы. DzSocket имеет ресурс KeepAlive, позволяющий использовать собственный сетевой протокол поддержания активности.
Команды : собственный сокет позволяет отправлять сегмент строки, но если вы хотите отправлять команды и идентифицировать эти команды на другой стороне соединения, вам придется реализовать это вручную. Благодаря DzSocket у вас всегда будет доступна команда Char. Готово, быстро и легко.
Автоматическое освобождение объектов данных на сервере : список объектов «Клиент», доступный на компоненте «Сервер», имеет свойство Pointer, позволяющее хранить информацию о клиентском соединении, обычно с использованием объекта. С DzSocket вам не нужно беспокоиться об уничтожении этого объекта. Вам просто нужно включить свойство, которое будет заботиться об этих объектах.
Перечислитель : собственный компонент сервера не имеет перечислителя для перебора подключений списка клиентов. Используя DzSocket , вы можете просто выполнить for .. in
непосредственно на компоненте Server, повторяя соединения со списком клиентов.
SendAll : легко отправлять команду всем клиентам. Кроме того, вы можете использовать SendAllEx
для отправки команды всем клиентам, кроме определенного клиентского соединения.
Монитор подключения : существует событие «Потеря соединения», позволяющее узнать, когда соединение было закрыто без запроса клиента.
Поддержка Unicode : собственный компонент Delphi не поддерживает отправку сообщений с использованием строк Unicode, если только вы не напишете собственный код для преобразования потока данных с обеих сторон. Это действительно скучно и требует времени. Используя DzSocket вы можете просто отправлять текст сообщения, используя непосредственно параметр метода в качестве типа строки, поэтому Delphi по умолчанию будет рассматривать символы Юникода как WideString.
Контроль входа в систему : вы можете контролировать аутентификацию/авторизацию клиента с помощью простых событий, а также отправлять дополнительную информацию для управления доступом клиента к серверу.
Автоматическое повторное подключение : клиентский компонент может автоматически повторно подключаться к серверу при потере соединения, просто включив свойство.
И многое другое!
Поддерживает Delphi XE3..Delphi 11.
AutoFreeObjs: Boolean
(public) = Если вы используете свойство Data
клиентских сокетов на сервере для назначения объектов, вы можете включить эту опцию, чтобы компонент позаботился об уничтожении объекта при завершении клиентского сокета. Помните, что если эта опция включена и назначено свойство Data сокета, компонент всегда будет считать данные объектом.
EnumeratorOnlyAuth: Boolean
(public) = При использовании перечислителя компонентов for in
обходить клиенты, которые еще не прошли проверку подлинности.
KeepAlive: Boolean
= Разрешить включение собственного ресурса сокета KeepAlive. Это отправит сигнал поддержания активности с использованием свойства KeepAliveInterval.
KeepAliveInterval: Integer
= Указывает интервал KeepAlive в миллисекундах (по умолчанию 15000/15 секунд ).
Port: Word
= указывает TCP-порт прослушивания сервера. Это свойство необходимо для запуска сокета сервера.
Connection[Index: Integer]: T DzSocket
(public) = Возвращает объект подключения клиента T DzSocket по индексу.
Count: Integer
(public) = Возвращает количество клиентских подключений в списке.
procedure OnClientConnect (Sender: TObject; Socket: T DzSocket );
Это событие срабатывает, когда клиент подключается к серверу. Параметр Socket
— это клиентский сокет.
procedure OnClientDisconnect (Sender: TObject; Socket: T DzSocket );
Это событие срабатывает, когда клиент отключается от сервера. Параметр Socket
— это клиентский сокет.
procedure OnClientError (Sender: TObject; Socket: T DzSocket ;
const Event: TErrorEvent; const ErrorCode: Integer; const ErrorMsg: string);
Это событие срабатывает, когда возникает ошибка клиентского соединения. Параметр Socket
— это клиентский сокет.
procedure OnClientRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
Это событие срабатывает, когда клиент отправляет сообщение на сервер. Параметр Socket
— это клиентский сокет.
procedure OnClientLoginCheck (Sender: TObject; Socket: T DzSocket ; var Accept: Boolean;
const RequestData: String; var ResponseData: String);
Это событие срабатывает, когда клиент только что подключился к серверу. Если на стороне клиента обрабатывается OnLoginRequest
, отправленная информация о данных будет получена здесь, в параметре RequestData
. Вы можете изменить параметр Accept
(исходное значение по умолчанию — True), чтобы принять или отклонить клиентское соединение. Кроме того, вы можете использовать параметр ResponseData
для отправки клиенту некоторой информации о данных. Принятый флаг и информация о данных будут получены клиентом в событии OnLoginResponse
. Если параметр Accept
остается True, то для свойства сокета Auth
будет установлено значение True. В противном случае клиентское соединение будет разорвано сервером.
procedure OnClientLoginSuccess (Sender: TObject; Socket: T DzSocket );
Это событие срабатывает сразу после авторизации клиента на сервере. Даже если вы не используете события входа в систему, помните: только после того, как клиент авторизуется на сервере, клиент может отправлять сообщения. В противном случае сервер будет игнорировать любые сообщения клиента.
procedure Open ;
Включите порт сокета прослушивания сервера.
procedure Close ;
Выключите порт сокета прослушивания сервера.
procedure Lock ;
procedure Unlock ;
Используйте эти методы для перебора списка подключений (потокобезопасного), поскольку соединение может быть закрыто при переборе списка подключений.
Пример:
var CSock: T DzSocket ;
begin
Server.Lock;
try
for CSock in Server do
begin
// ...
end ;
finally
Server.Unlock;
end ;
end ;
Кроме того, компонент TDzTCPServer имеет перечислитель по умолчанию, указывающий на список соединений, в результате чего создается объект T DzSocket . Таким образом, вы можете перебирать список соединений, используя оператор
for .. in
, как и в предыдущем примере.
procedure Send (Socket: T DzSocket ; const Cmd: Char; const A: String = ' ' );
Отправляет команды и сообщения в клиентский сокет, указанный параметром Socket
. Вы должны использовать параметр Cmd
, чтобы указать командный символ, который будет получен клиентом. Параметр A
является необязательным и позволяет указать текст сообщения.
procedure SendAll ( const Cmd: Char; const A: String = ' ' );
Отправьте сообщение всем аутентифицированным клиентам.
procedure SendAllEx (Exclude: T DzSocket ; const Cmd: Char; const A: String = ' ' );
Отправьте сообщение всем прошедшим проверку подлинности клиентам, кроме клиента, указанного параметром Exclude
.
function FindSocketHandle ( const ID: TSocket): T DzSocket ;
Возвращает объект T DzSocket по идентификатору дескриптора сокета.
function GetAuthConnections : Integer;
Получает только количество аутентифицированных подключений.
AutoReconnect: Boolean
= Если включено, когда клиент теряет соединение с сервером, сокет попытается автоматически повторно подключиться.
AutoReconnectInterval: Integer
= Указывает время в миллисекундах ожидания новой попытки повторного подключения (по умолчанию 10000/10 секунд ).
AutoReconnectAttempts: Integer
= Сколько раз можно попытаться повторно подключиться после потери соединения. Оставьте значение 0
чтобы повторять попытки бесконечно.
KeepAlive: Boolean
= Разрешить включение собственного ресурса сокета KeepAlive. Это отправит сигнал поддержания активности с использованием свойства KeepAliveInterval.
KeepAliveInterval: Integer
= Указывает интервал KeepAlive в миллисекундах (по умолчанию 15000/15 секунд ).
Host: String
= указывает IP-адрес или имя хоста (DNS) для подключения к серверу. Это свойство необходимо для подключения к сокету сервера.
Port: Word
= указывает TCP-порт клиентского подключения, который прослушивает сервер или отображает порт. Это свойство необходимо для подключения к сокету сервера.
Connected: Boolean
(public) = Возвращает true, если соединение установлено.
SocketHandle: TSocket
(public) = Возвращает идентификатор дескриптора сокета соединения.
procedure OnConnect (Sender: TObject; Socket: T DzSocket );
Это событие срабатывает, когда клиент устанавливает соединение с сервером.
procedure OnConnectionLost (Sender: TObject; Socket: T DzSocket );
Это событие срабатывает при потере соединения между клиентом и сервером. Это произойдет, если клиент обнаружит, что соединение было закрыто без команды отключения самого клиента.
procedure OnDisconnect (Sender: TObject; Socket: T DzSocket ;
const WasConnected: Boolean);
Это событие срабатывает, когда клиент отключается от сервера, даже если соединение потеряно. WasConnected
позволяет вам узнать, произошло ли событие OnDisconnect из установленного соединения, поскольку это событие будет запущено, даже если вы пытаетесь подключиться, а соединение не установлено.
procedure OnError (Sender: TObject; Socket: T DzSocket ;
const Event: TErrorEvent; const ErrorCode: Integer; const ErrorMsg: string);
Это событие срабатывает, когда возникает ошибка клиентского соединения. Всегда рекомендуется устанавливать это событие, иначе компонент будет вызывать неконтролируемые асинхронные ошибки.
procedure OnRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
Это событие срабатывает, когда клиент получает сообщение от сервера.
procedure OnLoginRequest (Sender: TObject; Socket: T DzSocket ; var Data: String);
Это событие срабатывает сразу после подключения клиента к серверу. Это означает, что сервер запрашивает данные для входа в систему, поэтому он может проверить эти данные и выбрать принятие или прекращение клиентского соединения. Вам следует заполнить параметр Data
, если вы хотите обрабатывать эту информацию на сервере.
procedure OnLoginResponse (Sender: TObject; Socket: T DzSocket ; Accepted: Boolean; const Data: String)
Это событие срабатывает, когда сервер принимает или отклоняет клиентское соединение. Вы можете проверить этот результат в параметре Accepted
, и сервер может отправить клиенту некоторую информацию о данных в параметре Data
.
procedure OnReconnection (Sender: TObject; Socket: T DzSocket ; Attempt: Integer; Cancel: Boolean)
Происходит, когда свойство AutoReconnect
включено и соединение теряется по истечении миллисекунд AutoReconnectInterval
. Если попытка повторного подключения не удалась, событие будет запускаться последовательно, пока соединение не будет установлено. Вы можете отменить попытки повторного подключения, изменив свойство Cancel
на True
в событии повторного подключения или вызвав метод StopReconnection
.
procedure Connect ;
Подключается к серверу.
procedure Disconnect ;
Отключается от сервера.
procedure StopReconnection ;
Останавливает попытки повторного подключения, если включено AutoReconnect
и соединение потеряно.
procedure Send ( const Cmd: Char; const A: String = ' ' );
Отправляет команды и сообщения на сервер. Вы должны использовать параметр Cmd
, чтобы указать командный символ, который будет получен сервером. Параметр A
является необязательным и позволяет указать текст сообщения.
Важно: Сервер не будет получать сообщения, пока клиент еще не прошел аутентификацию, даже если он уже подключен.
Доступно только в Delphi XE6 или выше.
Когда вы используете метод Send
из сокета сервера или клиента, существует параметр String
позволяющий отправлять данные. Существует два глобальных метода, которые можно использовать для одновременной отправки нескольких данных:
type TMsgArray = TArray<Variant>;
function ArrayToData ( const Fields: TMsgArray): String;
function DataToArray ( const Data: String): TMsgArray;
Отправитель:
var
I: Integer;
S: String;
begin
I := 123 ;
S := ' Test ' ;
DzTCPClientTest.Send( ' M ' , ArrayToData([I, S]));
end ;
Получатель:
procedure DzTCPServerTestClientRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
var MsgArray: TMsgArray;
begin
MsgArray := DataToArray(A);
ShowMessage(Format( ' Number = %d / String = %s ' , [MsgArray[ 0 ], MsgArray[ 1 ]]));
end ;
Функции преобразования внутренне используют JSON, чтобы обеспечить экранирование символов частей и гарантировать упаковку/распаковку массивов без изменения содержимого. Таким образом, вам не нужно беспокоиться о содержании частей варианта типа.
Пожалуйста, проверьте демонстрационное приложение и просмотрите команду «Отправить на печать», чтобы узнать, как отправлять и получать поток данных, а также использовать сжатие для увеличения скорости связи.