应用TIdECHOServer和TIdEcho组件

本文介绍了一个简单的Echo客户端与服务器的实现过程,包括客户端连接、发送消息及接收回应的功能,以及服务器端的消息处理和客户端连接管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1) unit U_Echo_Client;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdEcho, StdCtrls;
type
  TEcho_Client = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    BConnect: TButton;
    BSend: TButton;
    BDisCon: TButton;
    EAddress: TEdit;
    EText: TEdit;
    LTime: TLabel;
    LReceive: TLabel;
    IdEcho1: TIdEcho;
    procedure BConnectClick(Sender: TObject);
    procedure BSendClick(Sender: TObject);
    procedure BDisConClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure EAddressChange(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Echo_Client: TEcho_Client;

implementation

{$R *.dfm}

procedure TEcho_Client.FormCreate(Sender: TObject);
begin
    BConnect.Enabled := True;  //激活“连接”按钮
    EText.Enabled := False;   //禁用发送文本框
    EText.color := clSilver;
    BSend.Enabled :=False;  //禁用“发送”按钮
    BDisCon.Enabled := False; //禁用“断开连接”按钮
end;

procedure TEcho_Client.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
   IdEcho1.Disconnect;
end;

procedure TEcho_Client.EAddressChange(Sender: TObject);
begin
  // 设置要连接的服务器的地址
 IdEcho1.Host := EAddress.Text;
end;

procedure TEcho_Client.BConnectClick(Sender: TObject);
begin
  try
    //建立与Echo服务器的连接
    IdEcho1.Connect;
    EText.Enabled := True;  //激活发送文本框
    EText.color := clWhite;
    BSend.Enabled := True;//激活“发送”按钮
    BDisCon.Enabled := True;//激活“断开连接”按钮
    BConnect.Enabled :=False;//禁用“连接”按钮
  except
    //断开与Echo服务器的连接
    IdEcho1.Disconnect;
    ShowMessage('连接失败,请检查服务器是否运行!');
  end; //try..except
end;

procedure TEcho_Client.BSendClick(Sender: TObject);
begin
  //对发送文本框的内容不为‘’的情况进行处理
  if EText.Text<>'' then
    begin
      //发送并接收回声数据
      lTime.Caption := IdEcho1.Echo ( EText.Text );
      //显示发送和接收回声数据所需的时间
      LReceive.Caption := IntToStr ( IdEcho1.EchoTime );
    end
  //对发送文本框的内容为‘’的情况进行处理
  else
    begin
      lTime.Caption :='';
      LReceive.Caption :='';
    end;      
end;

procedure TEcho_Client.BDisConClick(Sender: TObject);
begin
  //断开与Echo服务器的连接
  IdEcho1.Disconnect;
  BConnect.Enabled := True;  //激活“连接”按钮
  EText.Enabled := False;   //禁用发送文本框
  EText.color := clSilver;
  BSend.Enabled :=False;  //禁用“发送”按钮
  BDisCon.Enabled := False; //禁用“断开连接”按钮
end;

end.
(2) unit U_Echo_Server;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPServer,
  IdEchoServer;

type
  TF_Echo_Server = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    IdECHOServer1: TIdECHOServer;
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure IdECHOServer1Disconnect(AThread: TIdPeerThread);
    procedure IdECHOServer1Connect(AThread: TIdPeerThread);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  F_Echo_Server: TF_Echo_Server;

implementation

{$R *.dfm}
procedure TF_Echo_Server.FormActivate(Sender: TObject);
begin
 try
 //激活TIdECHOServer组件
  IdECHOServer1.Active := True;
 except
  ShowMessage('拒绝连接!由于安全的原因无法绑定到预定的端口!');
  Application.Terminate;
 end;
end;

procedure TF_Echo_Server.IdECHOServer1Disconnect(AThread: TIdPeerThread);
begin
  //更新窗体上显示的服务器状态
  Label2.caption := '[ 空闲-等待新用户 ]';
end;

procedure TF_Echo_Server.IdECHOServer1Connect(AThread: TIdPeerThread);
begin
 //更新窗体上显示的服务器状态
 Label2.caption := '[ 服务于客户 ]';
end;

procedure TF_Echo_Server.Button1Click(Sender: TObject);
begin
  if IdECHOServer1.active then
    IdECHOServer1.active := false;
  Application.terminate;
end;

end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值