2021 年 9 月 12 日(3.1 版)
2021 年 5 月 25 日(3.0 版)
2021 年 3 月 13 日(2.6 版)
2021 年 2 月 1 日(2.5 版)
2020 年 12 月 18 日(2.4 版)
2020年11月28日
2020 年 10 月 31 日(2.3 版)
2020 年 10 月 27 日(2.2 版)
2020 年 10 月 26 日(2.1 版)
2020年10月9日
10/06/2020
2020年9月24日
2020年7月16日
2020年7月12日
2020年5月3日
2020年4月19日
2019/03/31
这些组件允许您在 LAN 网络或 Internet 上的计算机之间建立 TCP Socket 异步通信。
DzTCPServer和DzTCPClient使用System.Win.ScktComp单元的TClientSocket和TServerSocket 。这些类在Delphi上都有,但是实现起来有点困难,因为你需要读写缓冲区数据,而且可用的资源不多。
使用方法非常简单。您需要将服务器组件放在服务器端应用程序上,将客户端组件放在客户端应用程序上,然后开始编写命令消息。
您可以做很多事情,例如聊天应用程序、远程命令应用程序、远程监控应用程序,甚至发送文件等流。天空是极限。
缓存结构:当您使用Delphi原生socket组件时,如果您同时发送多个消息,接收者可能会收到分组或分开的消息,因此您需要始终处理这个问题。 DzSocket自动控制套接字消息,因此您始终会收到每条消息一个事件。
KeepAlive :当建立套接字连接时,如果连接的一侧丢失,则另一侧将无法进行通信,直到尝试发送新消息。所以你可以实现手动ping,但这会带来很多不必要的工作。 DzSocket具有 KeepAlive 资源,启用网络本机 keep-alive 协议。
命令:本机套接字允许您发送字符串段,但如果您想发送命令并在连接的另一端识别该命令,则需要手动实现。使用DzSocket ,您可以始终使用 Char 命令。准备好、快速、简单。
服务器上的自动释放数据对象:服务器组件上可用的客户端对象列表具有指针属性,允许您存储有关客户端连接的信息,通常使用对象。使用DzSocket ,您无需担心此对象被破坏。您只需要启用一个属性来处理这些对象。
枚举器:本机服务器组件没有枚举器来迭代客户端列表连接。使用DzSocket ,您可以直接在服务器组件上执行for .. in
,迭代客户端列表连接。
SendAll :轻松向所有客户端发送命令。除此之外,您可以使用SendAllEx
将命令发送到除特定客户端连接之外的所有客户端。
连接监视器:有一个连接丢失事件,让您知道连接何时在没有客户端请求的情况下关闭。
Unicode 支持:Delphi 本机组件不支持使用 Unicode 字符串发送消息,除非您编写自己的代码来转换双方的数据流。这真的很无聊而且需要时间。使用DzSocket您可以直接使用方法参数作为字符串类型简单地发送消息文本,因此Delphi默认将Unicode字符视为WideString。
登录控制:您可以通过使用简单的事件来控制客户端身份验证/授权,并且可以发送额外的数据信息来控制客户端对服务器的访问。
自动重新连接:当连接丢失时,客户端组件可以自动重新连接到服务器,只需启用一个属性。
还有更多!
支持Delphi XE3..Delphi 11
AutoFreeObjs: Boolean
(public) = 如果您使用服务器上客户端套接字的Data
属性来分配对象,则可以启用此选项,这样组件将在客户端套接字结束时负责对象销毁。请记住,如果启用此选项并且分配了套接字的 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
(公共)= 返回客户端连接列表计数。
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 ;
通过套接字句柄 ID 返回 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
(公共)= 如果建立了连接,则返回 true。
SocketHandle: TSocket
(public) = 返回连接的套接字句柄 ID。
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 来确保部分字符转义,以确保打包/解包数组而不更改内容。因此,您无需担心变体类型零件的内容。
请查看演示应用程序并查看发送打印命令以了解如何发送和接收数据流,以及如何使用压缩来提高通信速度。