Delphi Labs: DataSnap XE - トランスポートフィルタ

By: Chikako Yonezawa

Abstract: DataSnap アーキテクチャでは、TCP/IP, HTTP, HTTPS のような異なる通信プロトコルを使用することができます。また、クライアントとサーバー間のネットワーク上で流れる生のバイトストリームに、プログラムでアクセス可能なトランスポートフィルタを使用することができます。Delphi XE には、暗号化用に2つと圧縮用に1つのプリインストールされた 3つの DataSnap トランスポートフィルタが付属しています。このラボでは、サーバーとクライアントアプリケーションで構成されている単純なシステムを構築します。双方のアプリケーションは、スタンドアロンの Delphi VCL フォームアプリケーションで、通信プロトコルとして TCP/IP を使って通信し、Zlib 圧縮フィルタを使用します。このデモの記事は http://edn.embarcadero/com/jp/delphi で、ソースコードは、Embarcadero Code Central (http://cc.embarcadero.com/item/28232) で公開しています。

In This Article

はじめに

DataSnap アーキテクチャでは、TCP/IP, HTTP, HTTPS のような異なる通信プロトコルを使用することができます。また、クライアントとサーバー間のネットワーク上で流れる生のバイトストリームに、プログラムでアクセス可能なトランスポートフィルタを使用することができます。

Delphi XE には、暗号化用に2つと圧縮用に1つのプリインストールされた 3つの DataSnap トランスポートフィルタが付属しています。

このラボで、サーバーとクライアントアプリケーションで構成されている単純なシステムを構築します。双方のアプリケーションは、スタンドアロン Delphi VCL フォームアプリケーションで、通信プロトコルとして TCP/IP を使って通信し、“Zlib” 圧縮フィルタを使用します。

サーバーを構築する

IDEのメニューより [ファイル|新規作成|その他] をクリックし、「新規作成」ダイアログの “Delphi プロジェクト\DataSnap Server” カテゴリ内の “DataSnap Server” をダブルクリックして、スタンドアロンの Delphi DataSnap サーバーアプリケーションを作成します。

DataSnap01

ウィザードの最初の画面では、デフォルトのプロジェクト種類である “VCL フォームアプリケーション” のままにします。

残りのウィザードの画面上もすべてデフォルトの値とし、[完了] ボタンをクリックして、DataSnap サーバープロジェクトを生成します。

IDEのメニューから [ファイル|すべて保存] を選択し、ウィザードで作成された新しいプロジェクトのすべてのファイルを保存します。例えば、新しく “C:\DataSnapLabs\Filters\” フォルダを作成して、プロジェクトのメインユニットに “FormServerUnit” と命名し、他のユニット (通常 “ServerMethodsUnit1” と “ServerContainerUnit1”) はデフォルトの名前のままで、そして、プロジェクトには “FiltersServer” と命名して保存します。

ServerContainerUnit を開き、フォームデザイナ内の “DSTCPServerTransport1” コンポーネントを選択します。

DataSnap60

“Filters” プロパティの省略ボタン […] をクリックします。このプロパティはコレクションで、省略ボタンをクリックすると、トランスポートコンポーネントへ、1つ、またはそれ以上のフィルタを追加することができるコレクションエディタが表示されます。

コレクションエディタの [新規追加] ボタンをクリック (または、[追加] ボタンを押します) し、 “FilterId” プロパティのドロップダウンリスト内の目的のフィルタを選択します。

Delphi XE には、“PC1”, “RSA”, “ZlibCompression” の 3つのプリインストールされたフィルタが付属しています。

DataSnap61

DataSnap のトランスポートコンポーネントの “Filters” プロパティへ、ゼロ(0)、1、それ以上…のフィルターを追加することができます。

サーバーとクライアント間のトラフィックを圧縮するための “ZlibCompression” フィルタを追加します。

通信フィルタを適用した DataSnap サーバーの準備が整いました。クライアントの実装を行う番です。

プロジェクトマネージャで、プロジェクトグループのノード上でマウスの右ボタンをクリックし、表示されたポップアップメニューから [新規プロジェクトを追加] を選択します。表示された「新規作成」ダイアログで、“Delphi プロジェクト” のカテゴリから “VCL フォームアプリケーション” を選択し、IDEのメニューの [ファイル|すべて保存] を実行します。サーバープロジェクトと同じフォルダ内 (例えば “C:\DataSnapLabs\Filters\” フォルダ) に新しいファイルを保存するのがベストです。クライアントのメインとなるフォームユニットに “FormClientMain”、そのプロジェクト全体を “FiltersClient”、プロジェクトグループには “DSFilters” と命名します。

クライアントを実装する前に、サーバーが起動していなければなりません。プロジェクトグループ上で、マウスの右ボタンをクリックし、[すべてビルド] を選択します。サーバープロジェクトがアクティブ ( サーバープロジェクト名が、プロジェクトマネージャ内で「太字」に表示されている )であることを確認し、IDE のメニューから [実行|デバッガなしで実行] を選択します。サーバーのウィンドウは最小化しておきます。サーバーは、クライアントの開発の間、実行されている必要があります。

クライアントを構築する

この段階で、プロジェクトグループは、サーバーとクライアントで構成されます。クライアントの実装を行うためには、サーバーが実行されている必要があります。

クライアントアプリケーションのメインフォームを開き、フォーム上に “TSQLConnection” コンポーネントをドロップします。

“Driver” プロパティを “DataSnap” に設定し、 “LoginPromptSet” を “false” に設定します。

“Connected” プロパティを “true” に設定し、接続できるか試します。

残念ながら接続できません。以下のエラーメッセージが表示されるはずです。

DataSnap62

クライアントの圧縮フィルタを有効にしていないので、サーバーに接続できません。

“SQLConnection1” コンポーネントの “Driver” プロパティを展開し、DataSnap の Driver の “Filters” プロパティに “ZLibCompression” を追加します。

DataSnap63

わかりにくいですが、このラボの記事の最も重要な部分です!

“DBXCompressionFilter” ユニットをクライアントアプリケーション内の任意のユニット uses 句に追加する必要があります。この操作の副作用は、圧縮フィルタ (TTransportCompressionFilter) がこのユニットの “initialization” 節内でクライアントに登録されることです。

“SQLConnection1” コンポーネント上で、マウスの右ボタンをクリックし、表示されたポップアップメニューから、[DataSnap クライアントクラスの生成] を選択します。

“proxy” として生成されたユニットを保存します。

クライアントフォームの “uses” 句に、“proxy” ユニットを追加します。

クライアントフォームに、ひとつのボタンとひとつのエディットコンポーネントを追加します。

ボタンコンポーネント上でダブルクリックし、 “OnClick” イベントハンドラに、以下のコードを入力します。

// …

implementation

uses
  DBXCompressionFilter, // needed for "ZLibCompression" filter
  proxy;

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
var aClient: TServerMethods1Client;
begin
  aClient := TServerMethods1Client.Create(SQLConnection1.DBXConnection);
  try
    Edit1.Text := aClient.ReverseString(Edit1.Text);
  finally
    aClient.Free;
  end;
end;

end.

クライアントアプリケーションを実行すれば、圧縮されたネットワーク上の TCP/IP 通信を使用し、“ReverseString” サーバーメソッドを正しく呼び出すことができるはずです。

まとめ

この “Delphi Labs” では、DataSnap XE の通信フィルタのサポートについてご覧頂きました。

この例の中で、双方のアプリケーション間で交換される生のバイトストリームを圧縮するために、 “ZlibCompression” フィルタを使用して TCP/IP 経由で通信するテストサーバーとクライアントを構築しました。

わかりにくいですが、この記事の最も重要な「理解する」ことは、クライアントプロジェクト内の任意のユニットの “uses” 句 へ “DBXCompressionFilter” ユニットを追加することです。

public/private キーを交換することのできる 2フェーズの通信プロトコルを使用して通信を暗号化する方法の情報を含む DataSnap XE フィルタに関する詳細情報は、オンラインの docwiki (http://docwiki.embarcadero.com/RADStudio/XE/en/Filtering_DataSnap_Byte_Stream) でご覧いただけます。

この記事のソースコードは、Code Central (http://cc.embarcadero.com/item/28232) にあります。デモのビデオ版は、YouTube (http://www.youtube.com/watch?v=GE4FJDJI9RI) で公開しています。

"Delphi Labs" に関する詳細情報は、http://blogs.embarcadero.com/pawelglowacki にて公開しています。


Published on: 3/9/2011 11:22:04 PM

Server Response from: ETNASC03

Copyright© 1994 - 2013 Embarcadero Technologies, Inc. All rights reserved.