delphi socket网络编程

 

一、socket通信原理:

http://www.cnblogs.com/dolphinX/p/3460545.html;

1、握手连接过程;

2、服务端主要函数:

bind,listen,accept,write,close

3、客户端主要函数:

connect,read。

4、套接字=ip+TCP/UDP+portid

二、demo:客户端和服务器端在同一台机器上,但是端口设置不同,host  ip为ipconfig得出的ip

1.客户端需要连接服务器信息(ip,port);

2.服务器端配置一个端口号,供客户端连接88.

三、源码:

1、客户端:

unit client;

interface

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

type
  TForm1 = class(TForm)
    mmoclient: TMemo;
    pnl1: TPanel;
    edtHostaddr: TEdit;
    lblhostaddr: TLabel;
    edtPort: TEdit;
    lblPort: TLabel;
    edtdata: TEdit;
    btnconn: TButton;
    clntsckt1: TClientSocket;
    btncancel: TButton;
    btnrec: TButton;
    procedure btnconnClick(Sender: TObject);
    procedure btncancelClick(Sender: TObject);
    procedure btnrecClick(Sender: TObject);
    procedure clntsckt1Read(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnconnClick(Sender: TObject);
begin
  clntsckt1.Host := edtHostaddr.Text;
  clntsckt1.Port := strtoint(edtPort.Text);
  clntsckt1.Active := true;
  Self.Caption := '连接socket服务器成功!';
//  clntsckt1.Open;
end;

procedure TForm1.btncancelClick(Sender: TObject);
begin
  clntsckt1.Close;
end;

procedure TForm1.btnrecClick(Sender: TObject);
begin
  with ClientSocket1 do
  begin
    if Trim(edtdata.Text)<>'' then
    begin
      mmoclient.Lines.Add('客户端:' + '  ' + datetimetostr(now));
      Socket.SendText(edtdata.Text);
      mmoclient.Lines.Add(edtdata.Text);
      mmoclient.Lines.Add('');
    end;
  end;

end;


procedure TForm1.clntsckt1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
  if (mmoclient.Lines.Count > 50) then
    mmoclient.Lines.Clear;

  mmoclient.Lines.Add('服务器:' + ' Ip=' + Socket.RemoteAddress + '  ' + datetimetostr
      (now));
  mmoclient.Lines.Add(Socket.ReceiveText);

end;

end.

2、服务端:

unit testserver;

interface

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

type
  TfrmServer = class(TForm)
    mmoserver: TMemo;
    edtport: TEdit;
    edtdata: TEdit;
    btnsend: TButton;
    srvrsckt1: TServerSocket;
    btnconn: TButton;
    procedure btnconnClick(Sender: TObject);
    procedure btnsendClick(Sender: TObject);
    procedure srvrsckt1Listen(Sender: TObject; Socket: TCustomWinSocket);
    procedure srvrsckt1Accept(Sender: TObject; Socket: TCustomWinSocket);
    procedure srvrsckt1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmServer: TfrmServer;

implementation

{$R *.dfm}

procedure TfrmServer.btnconnClick(Sender: TObject);
begin
  if Trim(edtport.Text)<>'' then
  begin
    srvrsckt1.Port :=StrToInt(edtport.Text);
    srvrsckt1.Active:=True;
    mmoserver.Lines.Add('服务准备好');
  end;
end;

procedure TfrmServer.btnsendClick(Sender: TObject);
var
  sr1:string;
  in1:Integer;
begin
  if edtdata.Text<>'' then
  begin
    srvrsckt1.Socket.Connections[0].SendText(edtdata.Text);
    in1:=srvrsckt1.Socket.Connections[0].RemotePort;
    sr1:= srvrsckt1.Socket.Connections[0].RemoteAddress + IntToStr(in1) ;
     mmoserver.Lines.Add(sr1);
  end;
end;

procedure TfrmServer.srvrsckt1Listen(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  mmoserver.Lines.Add('listen##############################');
end;

procedure TfrmServer.srvrsckt1Accept(Sender: TObject;
  Socket: TCustomWinSocket);
begin
   mmoserver.Lines.Add('accept##############################');
end;

procedure TfrmServer.srvrsckt1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
   mmoserver.Lines.Add(Socket.ReceiveText);
end;

end.

 

posted on 2017-07-06 10:33  runningcode  阅读(720)  评论(0编辑  收藏  举报