delphi之socket通訊


使用了2個組建:

TServerSocket

TClientSocket

------------------TServerSocket---------------------------

//開啟連接

ServerSocket1.Port := 9000;
ServerSocket1.Active := true;

 

//接收客戶端發送的消息。對應事件:OnClientRead

Socket.ReceiveText

 

//發送消息給客戶端。

ServerSocket1.Socket.Connections[0].SendText(Edit1.Text);

 

----------------------TClientSocket---------------------------------------

//連接服務端

ClientSocket1.Host := '127.0.0.1';
ClientSocket1.Port := 9000;

ClientSocket1.Active := true;

 

//接受服務端發送的消息 。對應事件:OnRead

str := Socket.ReceiveText

 

//發送消息給服務端。

ClientSocket1.Socket.SendText(Edit1.Text);

 

 

下面為完整代碼:

 

unit Client;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls, ExtCtrls, Sockets;

type
  TFrmClient = class(TForm)
    ClientSocket1: TClientSocket;
    Memo1: TMemo;
    Panel1: TPanel;
    Label2: TLabel;
    Edit2: TEdit;
    Button2: TButton;
    Panel2: TPanel;
    Label1: TLabel;
    Button1: TButton;
    Edit1: TEdit;
    Label3: TLabel;
    Edit3: TEdit;

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

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FrmClient: TFrmClient;

implementation

{$R *.dfm}

procedure TFrmClient.Button2Click(Sender: TObject);
begin
  if (ClientSocket1.Active = false) then
  begin
    ClientSocket1.Host := Edit3.Text;
    ClientSocket1.Port := strtoint(Edit2.Text);

    ClientSocket1.Active := true;
    Self.Caption := '連接socket服務器成功!';
  end;
end;

procedure TFrmClient.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  // Memo1.Lines.Add('服務器說:' + Socket.ReceiveText);
  if (Memo1.Lines.Count > 50) then
    Memo1.Lines.Clear;

  Memo1.Lines.Add('服務器:' + ' Ip=' + Socket.RemoteAddress + '  ' + datetimetostr
      (now));

  // Socket.RemoteHost +
  Memo1.Lines.Add(Socket.ReceiveText);
  Memo1.Lines.Add('');
end;

procedure TFrmClient.Button1Click(Sender: TObject);
begin
  // ClientSocket1.Socket.SendText(Edit1.Text);
  with ClientSocket1 do
  begin
    if Edit1.Text <> '' then
    begin
      Memo1.Lines.Add('客戶端:' + '  ' + datetimetostr(now));
      Socket.SendText(Edit1.Text);
      Memo1.Lines.Add(Edit1.Text);
      Memo1.Lines.Add('');
    end;
  end;
end;

end.
unit server;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ScktComp;

type
  TFrmMain = class(TForm)
    ServerSocket1: TServerSocket;
    Memo1: TMemo;
    Panel1: TPanel;
    Edit2: TEdit;
    Label2: TLabel;
    Button2: TButton;
    Panel2: TPanel;
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    CheckBox1: TCheckBox;
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button2Click(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FrmMain: TFrmMain;

implementation

{$R *.dfm}

procedure TFrmMain.Button1Click(Sender: TObject);
begin
  with ServerSocket1 do
  begin
    if Edit1.Text <> '' then
    begin
      Memo1.Lines.Add('服務器:' + '  ' + datetimetostr(now));
      Socket.Connections[0].SendText(Edit1.Text);
      // Socket.Connections[0].RemoteAddress;//IP
      Memo1.Lines.Add(Edit1.Text);
      Memo1.Lines.Add('');
    end;
  end;
end;

procedure TFrmMain.Button2Click(Sender: TObject);
begin
  if Edit2.Text <> '' then
  begin
    try
      ServerSocket1.Port := strtoint(Edit2.Text);
      ServerSocket1.Active := true;
      Self.Caption := 'Socket服務器待命中,端口:' + Edit2.Text;
      Button2.Enabled := False;
    except
      Self.Caption := 'Socket服務器沒有准備好';
    end;
  end;
end;

procedure TFrmMain.Edit2Change(Sender: TObject);
begin
  Button2.Enabled := true;
end;

procedure TFrmMain.FormCreate(Sender: TObject);
begin
  Self.Caption := 'Socket服務器';
end;

procedure TFrmMain.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add('-----客戶端:' + Socket.RemoteAddress + ' 發消息來連接了--');
end;

procedure TFrmMain.ServerSocket1ClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  ErrorCode := 0;
end;

procedure TFrmMain.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  stemp: string;
begin
  try
    if (Memo1.Lines.Count > 50) then
      Memo1.Lines.Clear;

    Memo1.Lines.Add('客戶端:' + ' Ip=' + Socket.RemoteAddress + '  ' +
        datetimetostr(now));

    // Socket.RemoteHost +
    Memo1.Lines.Add(Socket.ReceiveText);
    Memo1.Lines.Add('');

    if (CheckBox1.Checked = true) then
    begin
      Button1.Click;
      // Socket.SendText(Edit1.Text);
    end;

  except
    Memo1.Lines.Add(datetimetostr(now) + ' :程序異常');
  end;
end;

end.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM