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.