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/09
2020/10/06
2020/09/24
2020/07/16
2020/12/07
2020/05/03
2020/04/19
2019/03/31
これらのコンポーネントを使用すると、LAN ネットワークまたはインターネット上のコンピュータ間で TCP ソケットの非同期通信を確立できます。
DzTCPServer および DzTCPClient は、System.Win.ScktComp ユニットのTClientSocketおよびTServerSocket を使用します。これらのクラスは Delphi で利用できますが、バッファ データの読み書きが必要であり、利用できるリソースがあまりないため、実装が少し難しくなります。
使い方はとても簡単です。サーバー側アプリにサーバー コンポーネントをドロップし、クライアント側アプリにクライアント コンポーネントをドロップして、コマンド メッセージのコーディングを開始する必要があります。
チャット アプリ、リモート コマンド アプリ、リモート監視アプリなど、さまざまなことができるほか、ファイルなどのストリームを送信することもできます。空は限界です。
キャッシュ構造: Delphi ネイティブ ソケット コンポーネントを使用している場合、複数のメッセージを同時に送信すると、受信者はメッセージをグループ化または分割して受信する可能性があるため、常にこの問題に対処する必要があります。 DzSocketソケット メッセージを自動的に制御するため、メッセージごとに常に 1 つのイベントを受信します。
KeepAlive : ソケット接続を確立するときに、接続の一方が失われると、新しいメッセージの送信が試行されるまでもう一方は通信されません。したがって、手動 ping を実装することもできますが、これにより多くの不必要な作業が発生します。 DzSocketは KeepAlive リソースがあり、ネットワーク ネイティブのキープアライブ プロトコルを有効にします。
コマンド: ネイティブ ソケットでは文字列セグメントを送信できますが、コマンドを送信して接続の反対側でこのコマンドを識別したい場合は、これを手動で実装する必要があります。 DzSocket使用すると、Char コマンドを常に使用できます。準備完了、迅速かつ簡単。
サーバー上の自動解放データ オブジェクト: サーバー コンポーネントで使用できるクライアント オブジェクト リストには Pointer プロパティがあり、通常はオブジェクトを使用してクライアント接続に関する情報を保存できます。 DzSocketを使用すると、このオブジェクトの破壊について心配する必要はありません。これらのオブジェクトを処理できるようにプロパティを有効にするだけです。
Enumerator : ネイティブ サーバー コンポーネントには、クライアント リスト接続を反復するための列挙子がありません。 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
(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 ;
ソケット ハンドル 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
(public) = 接続が確立されている場合は 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
パラメーターがあります。複数のデータを一度に送信するために使用できるグローバルな方法が 2 つあります。
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 を使用して部分文字を確実にエスケープし、内容を変更せずに配列をパック/アンパックします。したがって、バリアント型パーツの内容について心配する必要はありません。
デモ アプリケーションを確認し、 Send Printコマンドを見て、データ ストリームの送受信方法、および圧縮を使用して通信速度を向上させる方法を確認してください。