TCPの通信をTClientSocketで行う 送信と受信
IndyのTCP通信のコンポーネントを使う例を以前の記事で示しましたが、今回はTClientSocketで行います。TClientSocketは標準ではインストールされていないので、まずインストールから行います。といってもどこからかダウンロードする必要はないです。

まず上図のようにトップメニューのコンポーネント->パッケージのインストールを選択、

”追加”ボタンを選択し、パスを“Program Files(x86)\Embarcadero\Studio\23.0\bin\”とたどると
以下の画面になるので、ファイル名に“dclsockets”まで入れると下図のように選択できるものが出てきますから、“dclsockets290.bpl”を選んで”開く”。(Version 12の場合です。)

下図で、“追加”を選択、

ここで保存。ここでフォームデザインのパレットを見ると、”Internet”というジャンルの下に

というようにTClientSocketとTServerSocketが見えるようになります。これを一つフォーム上にドロップします。TIdTCPClientと似ていますが、TClientSocketはIndyファミリーではありません。
さらにフォーム上に、TButtonx3,TMemox1を追加して、以下のように置きます。

Button1から3をダブルクリックし、ClientSocke1のイベントタブ以下の”OnRead”をダブルクリックして、以下のコードを足します。まとめてUnit1.cppごと示します。
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ClientSocket1->Host = "192.168.0.230";
ClientSocket1->Port = 25;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket)
{
AnsiString response;
response = Socket->ReceiveText();
Memo1->Lines->Add(response);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ClientSocket1->Active = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ClientSocket1->Socket->SendText("EHLO localhost\n");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
ClientSocket1->Socket->SendText("Quit\n");
}
//---------------------------------------------------------------------------
これでBuild & Run(F9)してみましょう。あ、忘れずにBuildする前にセーブしておきます。
ボタン1から3までをクリックすると、

こんな感じで受信結果が表示されますが、何をやっているかというと、local ip アドレス”192.168.0.230”のホストの25番ポート(SMTPのポート)へ、順次
EHLO localhost
Quit
を送った時のホスト側の応答になります。smtpプロトコルのテストですね。普通のsmtpセッションの場合であれば、そもそも25番ポートは通りませんが、これはlocal ip <-> local ipなので通ります。この後は、”認証”を経てメール送信セッションに移りますが、それは別記事で。今回は既存サーバーにちょっかい出してみることで、TClientSocketのテストに替えました。送信は、
ClientSocket1->Socket->SendText("送信したい文字列\n");
受信は、
AnsiString response = Socket->ReceiveText();
で、repsonseに受信したテキストが入ります。極めて簡便ですね。
コメント