在开始之前我们需要了解下这个Demo功能是啥

基于Delphi实现客户端服务端通信Demo_客户端

我们可以看到这是两个小project,左边的project有服务端和客户端1,右边的project只有一个客户端2

效果就是当两个客户端各自分别输入正确的IP地址和PORT端口,然后btconnect连接就可以连接到这个服务端

然后就可以发送消息,服务端的Memo1可以显示来自客户端发送信息的内容。

另外服务端也可以发送消息给两个客户端,做到双向传递信息。

两个客户端发送信息给服务端:

基于Delphi实现客户端服务端通信Demo_控件_02

服务端接收消息反馈给客户端:

基于Delphi实现客户端服务端通信Demo_客户端_03

做的很粗糙,但是大概功能算是实现了

具体做法:

第一步、

建立一个Project新建From1拖入如下控件TServerSocket,TClientSocket,TMemo2个,Label四个,TEdit两个

TButton四个,TStatusBar。然后设置属性,ServerSocket1的Action为True;ServerSocket1的Port为1025

 

 

代码如下:

 

unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, ComCtrls, ScktComp;



type

  TForm1 = class(TForm)

    ClientSocket1: TClientSocket;

    ServerSocket1: TServerSocket;

    Memo2: TMemo;

    StatusBar1: TStatusBar;

    Edit1: TEdit;

    Label1: TLabel;

    Label2: TLabel;

    Edit2: TEdit;

    btnConnect: TButton;

    btnSent: TButton;

    btnDisconnect: TButton;

    Button1: TButton;

    Memo1: TMemo;

    Label3: TLabel;

    Label4: TLabel;

    procedure ServerSocket1ClientConnect(Sender: TObject;

      Socket: TCustomWinSocket);

    procedure ServerSocket1ClientDisconnect(Sender: TObject;

      Socket: TCustomWinSocket);

    procedure ServerSocket1ClientRead(Sender: TObject;

      Socket: TCustomWinSocket);

    procedure Button1Click(Sender: TObject);

    procedure ClientSocket1Connect(Sender: TObject;

      Socket: TCustomWinSocket);

    procedure btnConnectClick(Sender: TObject);

    procedure btnDisconnectClick(Sender: TObject);

    procedure btnSentClick(Sender: TObject);

    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);

  private

    { Private declarations }

  public

    { Public declarations }

  end;



var

  Form1: TForm1;



implementation



{$R *.dfm}


////////////////////////////////////////////////////////////////////////服务端代码////////////////////////////////////////////////////////////////////////////////////////

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;

  Socket: TCustomWinSocket);

begin

StatusBar1.SimpleText := 'connect';

end;



procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;

  Socket: TCustomWinSocket);

begin

  StatusBar1.SimpleText := 'disconnect';

end;



procedure TForm1.ServerSocket1ClientRead(Sender: TObject;

  Socket: TCustomWinSocket);

begin

 Memo1.Lines.Add('悄悄的对你说'+ Socket.ReceiveText);

end;



procedure TForm1.Button1Click(Sender: TObject);

var i:integer;

begin


    for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do

    Serversocket1.socket.connections[i].SendText(Memo1.Text);//服务端向客户端发送信息


end;


////////////////////////////////////////////////////////////////////////客户端代码////////////////////////////////////////////////////////////////////////////////////////

procedure TForm1.ClientSocket1Connect(Sender: TObject;

  Socket: TCustomWinSocket);

begin

StatusBar1.SimpleText:='连接成功';//状态栏显示状态

end;



procedure TForm1.btnConnectClick(Sender: TObject);//输入IP和PORT连接

begin

 if not ClientSocket1.Active then

   begin

     ClientSocket1.Host := Edit1.Text;

     ClientSocket1.Port := StrToInt(Edit2.Text);

     ClientSocket1.Open;

     (Sender as TButton).Enabled := false;

      btnDisconnect.Enabled := true;

     end;

end;



procedure TForm1.btnDisconnectClick(Sender: TObject);//断开连接

begin

if ClientSocket1.Active then

   begin

     ClientSocket1.Close;

     btnDisconnect.Enabled := false;

     btnConnect.Enabled := true;

   end;

end;



procedure TForm1.btnSentClick(Sender: TObject);//连接成功后发送数据给服务端

begin

 if ClientSocket1.Active then

    ClientSocket1.Socket.SendText(Memo2.Text)

end;



procedure TForm1.ClientSocket1Read(Sender: TObject;

  Socket: TCustomWinSocket);//客户端监听来自服务端的数据

begin

Memo2.Lines.Add(Socket.ReceiveText);

end;



end.

 

第二步、

再新建一个project作为客户端2 建立Form1拖入控件TClientSocket,TMemo,TEdit两个,Label三个,TButton三个,TStatusBar

代码如下:

 

unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, ComCtrls, StdCtrls, ScktComp;



type

  TForm1 = class(TForm)

    ClientSocket1: TClientSocket;

    Memo2: TMemo;

    Edit1: TEdit;

    Edit2: TEdit;

    Label1: TLabel;

    Label2: TLabel;

    btnConnect: TButton;

    StatusBar1: TStatusBar;

    btnSent: TButton;

    btnDisconnect: TButton;

    Label3: TLabel;

    procedure ClientSocket1Connect(Sender: TObject;

      Socket: TCustomWinSocket);

    procedure btnConnectClick(Sender: TObject);

    procedure btnDisconnectClick(Sender: TObject);

    procedure btnSentClick(Sender: TObject);

    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);

  private

    { Private declarations }

  public

    { Public declarations }

  end;



var

  Form1: TForm1;



implementation



{$R *.dfm}



procedure TForm1.ClientSocket1Connect(Sender: TObject;

  Socket: TCustomWinSocket);

begin

StatusBar1.SimpleText:='连接成功';

end;



procedure TForm1.btnConnectClick(Sender: TObject);

begin

 if not ClientSocket1.Active then

   begin

     ClientSocket1.Host := Edit1.Text;

     ClientSocket1.Port := StrToInt(Edit2.Text);

     ClientSocket1.Open;

     (Sender as TButton).Enabled := false;

      btnDisconnect.Enabled := true;

     end;

end;



procedure TForm1.btnDisconnectClick(Sender: TObject);

begin

if ClientSocket1.Active then

   begin

     ClientSocket1.Close;

     btnDisconnect.Enabled := false;

     btnConnect.Enabled := true;

   end;

end;



procedure TForm1.btnSentClick(Sender: TObject);

begin

if ClientSocket1.Active then

    ClientSocket1.Socket.SendText(Memo2.Text)

end;



procedure TForm1.ClientSocket1Read(Sender: TObject;

  Socket: TCustomWinSocket);

begin

Memo2.Lines.Add(Socket.ReceiveText);

end;



end.