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 來確保部分字元轉義,以確保打包/解包數組而不更改內容。因此,您無需擔心變體類型零件的內容。
請查看演示應用程式並查看發送列印命令以了解如何發送和接收資料流,以及如何使用壓縮來提高通訊速度。