C++BuilderでのTClientSocketコンポーネントの使用法を、実際に動作確認用のテストプログラムを作成しながら説明します。
TClientSocketコンポーネントは、VCL用のコンポーネントですので、Windows専用のコンポーネントとなります。
尚、実際にプログラムの動作確認を行うには、TServerSocket用のテストプログラムも必要となりますので、以下の記事も参照ください。
TServerSocketの使い方、テストプログラムにつきましては、こちらの記事をご覧ください。
ソケット コンポーネントはデフォルトではインストールされません。インストール方法は以下の記事を参照してください。
TClientSocket, TServerSocketのインストールは、こちらの記事をご覧ください。
プロジェクトの作成
C++Builderで、初めてのプロジェクト作成で、説明した「SDIアプリケーション」をベースにテストプログラムを作成します。
プロジェクト名を、”client_test”に変更します。(プロジェクト名の変更を参照してください。)
次に、メッセージの表示用に、TMemoコンポーネントをDropし、Alignプロパティを”alClient”に設定します。
それから、TClientSocketコンポーネントをDropします。
最初のイベント処理を追加するを参考に、以下のイベントを追加しておきましょう。
イベント | 説明 |
---|---|
OnShow | フォームが表示されたとき(フォームの Visible プロパティが true に設定されている場合)に発生します。 |
OnCloseQuery | 問い合わせを終了しようとしたときに発生します。 |
OnClose | フォームを閉じたときに発生します。 |
TClientSocketコンポーネントのイベントの追加
TClientSocketコンポーネントの以下の4つのイベントを追加します。
イベント | 説明 |
---|---|
OnConnect | サーバーへの接続が開いた直後に、クライアント ソケット上で発生します。 |
OnDisconnect | クライアントソケットがサーバーソケットへの接続をクローズする直前に発生します。 |
OnError | ソケットが接続の確立,使用,またはシャットダウンに失敗したときに発生します。 |
OnRead | クライアント ソケットがソケット接続から情報を読み取らなければならないときに発生します。 |
TClientSocketコンポーネントの接続処理
TClientSocketコンポーネントに、接続先を設定して、Activeプロパティをtrueにします。
Open()メソッドを実行しても良いですね。Open()メソッドを実行すると、Activeプロパティはtrueとなります。
このコードは、コンストラクタか、OnShowイベントで実行すれば良いでしょう。
void __fastcall TSDIAppForm::FormShow(TObject *Sender)
{
// IPアドレスは、実行する環境に合わせて変更してください
ClientSocket->Host = "192.168.0.1";
ClientSocket1->Port = 2000;
ClientSocket1->Active = true;
}
TClientSocketコンポーネントのイベント内での処理
テストアプリケーションのTClientSocketコンポーネントのイベント内での処理を以下に示します。
OnConnectイベント
接続が完了した時に、Memo1にメッセージを表示しています。
void __fastcall TSDIAppForm::ClientSocket1Connect(TObject *Sender, TCustomWinSocket *Socket)
{
Memo1->Lines->Add("ClientSocket1Connect");
}
OnDisconnectイベント
接続が切れた時に、Memo1にメッセージを表示しています。
void __fastcall TSDIAppForm::ClientSocket1Disconnect(TObject *Sender, TCustomWinSocket *Socket)
{
Memo1->Lines->Add("ClientSocket1Disconnect");
}
OnErrorイベント
エラーが発生したときの処理の例です。
void __fastcall TSDIAppForm::ClientSocket1Error(TObject *Sender, TCustomWinSocket *Socket,
TErrorEvent ErrorEvent, int &ErrorCode)
{
Socket->Close();
ClientSocket1->Open();
ErrorCode = 0;
}
OnReadイベント
サーバー側からの送信データを、受信し、Memo1に表示しています。
ReceiveLength()で、送られて来たデータ長を取得し、ReceiveBuf()で実際にデータを受信します。
サーバーからのデータは、1バイトの文字データを想定してます。
実際には、もう少し複雑な処理になると思います。
void __fastcall TSDIAppForm::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket)
{
char buf[1024];
int Size = Socket->ReceiveLength();
if(Size > 1024) Size = 1024;
Socket->ReceiveBuf(buf, Size);
// 受信データが、ASCIIコードの文字の場合
String wstr = "";
for(int i=0;i<Size;i++)
{
wstr += buf[i];
}
Memo1->Lines->Add(buf);
}
データの送信
簡単に実装するために、ファイルの作成イベント(FileNew1)に、データ送信の処理を追加しました。
データの送信は、Socket->SendBuf()関数を使用します。
void __fastcall TSDIAppForm::FileNew1Execute(TObject *Sender)
{
char str[] = "Client Test";
ClientSocket1->Socket->SendBuf(str, sizeof(str));
}
再接続処理
簡単に実装するために、ファイルのオープンイベント(FileOpen1)に、再接続データ送信の処理を追加しました。Open()関数を実行して、接続待ちを行います。
void __fastcall TSDIAppForm::FileOpen1Execute(TObject *Sender)
{
if(!ClientSocket1->Socket->Connected)
{
ClientSocket1->Open();
Memo1->Lines->Add("再接続");
}
}
参考URL
Indy TIdTCPClient、Indy TIdTCPServerの使い方につきましては、以下の記事をご覧ください。
以下のHPも、参考にしてください。