2024/06/03 電子書籍「電子書籍出版・技術文書作成を劇的に加速!秀丸エディタ + Markdown + Pandocの驚異」を出版

TClientSocketの使用方法

C++Builder

C++BuilderでのTClientSocketコンポーネントの使用法を、実際に動作確認用のテストプログラムを作成しながら説明します。

TClientSocketコンポーネントは、VCL用のコンポーネントですので、Windows専用のコンポーネントとなります。

尚、実際にプログラムの動作確認を行うには、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も、参考にしてください。

タイトルとURLをコピーしました