-----------XE版,不是D7,XE的这个控件和D7有点不一样
来源:
Delphi XE IdTCPClient1 和 IdTCPServer1 数据的发送与接收(indy10)_136.la https://www.136.la/shida/show-131002.html
---个人学习--仅仅是学习控件
--这个学习的例子,有点问题,就是,想随时的自定义发送信息给客户端有问题,发送的消息不会显示(可能是没有收到,具体原因不知道,本人猜测,没有发送,只是缓存了,等下一次客户端发主动发消息过来,才能收到自定义的消息,暂时不去找具体原因,有时间再看看),但是客户端IdTCPClient发了新的消息,又收到自定义的信息
----IdTCPServer 、IdTCPClient - 程序园 http://www.voidcn.com/article/p-eplvabmi-bku.html
---------------------
------------
这里也有一些有点用处的东西:https://www.cnblogs.com/dmqhjp/p/14765447.html
在这个链接的最下方可能会有点有用的东西,---杂七杂八---
--------------
-------------------------Unit
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdContext, StdCtrls, IdTCPConnection, IdTCPClient, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer,IdGlobal, IdIOHandler, IdIOHandlerStream, IdIntercept, IdIOHandlerSocket, IdIOHandlerStack, ExtCtrls, IdAntiFreezeBase, IdAntiFreeze ;
type TMData = record id:Integer; Name:Array[0..20] of Char; Age:Byte; UpdateTime:double; end; TForm1 = class(TForm) IdTCPServer1: TIdTCPServer; Button1: TButton; Button2: TButton; Button3: TButton; Memo1: TMemo; IdTCPClient1: TIdTCPClient; Button4: TButton; Button5: TButton; Timer1: TTimer; Edit1: TEdit; Button6: TButton; IdAntiFreeze1: TIdAntiFreeze; procedure Button1Click(Sender: TObject); procedure IdTCPServer1Execute(AContext: TIdContext); procedure FormShow(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure IdTCPServer1Connect(AContext: TIdContext); procedure Button5Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure IdTCPClient1Connected(Sender: TObject); procedure Button6Click(Sender: TObject); private ClientIPList:TList; { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); var SendD: TMData; begin if not IdTCPClient1.Connected then IdTCPClient1.Connect; SendD.ID := 10; StrPCopy(SendD.Name,'Delphi 您好'); SendD.age := 18; SendD.UpdateTime := Now; IdTCPClient1.IOHandler.DefStringEncoding:=TEncoding.ASCII;//TEncoding.ASCII;//TEncoding.Unicode; IdTCPClient1.IOHandler.Write(#100); //提前发送一个标识符,用于区分数据 IdTCPClient1.IOHandler.Write(RawToBytes(SendD, SizeOf(SendD)));
end;
procedure TForm1.Button4Click(Sender: TObject); var MyIdTCPConnection:TIdTCPConnection; vIOHandler:TIdIOHandler; begin try //MyIdTCPConnection:=TIdTCPConnection.Create(nil); //vIOHandler:=TIdIOHandler.Create(nil); //MyIdTCPConnection.IOHandler :=vIOHandler; // //ShowMessage(TIdContext(ClientIPList.Items[0]).Connection.Name+','+TIdContext(ClientIPList.Items[0]).binding.peerIp);
//ShowMessage(IntToStr(TIdTCPConnection(ClientIPList.Items[0]).IOHandler.Port)+',,'+TIdTCPConnection(ClientIPList.Items[0]).IOHandler.Host); //MyIdTCPConnection.IOHandler.Port:=5050; //MyIdTCPConnection.IOHandler.Host:='192.168.1.50'; //MyIdTCPConnection.IOHandler.DefStringEncoding:=TEncoding.ASCII;//TEncoding.ASCII;//TEncoding.Unicode; //MyIdTCPConnection.Socket.Binding.SetPeer('192.168.1.50',5050); //MyIdTCPConnection.Socket.Open ; //MyIdTCPConnection.IOHandler.Open; //MyIdTCPConnection.IOHandler.Write('Qaaam'); //ShowMessage(TIdTCPConnection(ClientIPList.Items[0])); //TIdContext(ClientIPList.Items[0]).Connection.IOHandler.Write('AAAA'); //TIdTCPConnection(ClientIPList.Items[0]).IOHandler.Write(#10,TIdTextEncoding.ASCII); //TIdTCPConnection(ClientIPList.Items[0]).IOHandler.Writeln('QAAAAN',TIdTextEncoding.ASCII); TIdContext(ClientIPList.Items[0]).Connection.IOHandler.CheckForDisconnect(True, True); TIdContext(ClientIPList.Items[0]).Connection.IOHandler.Write('QAAAAN',TIdTextEncoding.ASCII); //TIdTCPConnection(ClientIPList.Items[0]).SendCmd('888') ; finally //FreeAndNil(MyIdTCPConnection); //FreeAndNil(vIOHandler);
end; end;
procedure TForm1.Button5Click(Sender: TObject); begin Timer1.Enabled:=not Timer1.Enabled ; if Timer1.Enabled then Button5.Caption:='不显示' else Button5.Caption:='显示'; //ShowMessage(IdTCPClient1.Intercept.ReadString(IdTCPClient1.IOHandler.InputBuffer.Size,TIdTextEncoding.UTF8 )); //ShowMessage(IdTCPClient1.IOHandler.ReadString(IdTCPClient1.IOHandler.InputBuffer.Size,) ); end;
procedure TForm1.Button6Click(Sender: TObject); begin //IdTCPClient1.IOHandler.Write(#10); if not IdTCPClient1.Connected then IdTCPClient1.Connect; IdTCPClient1.IOHandler.DefStringEncoding:=TEncoding.ASCII;//TEncoding.ASCII;//TEncoding.Unicode; //IdTCPClient1.IOHandler.Write(#0); //提前发送一个标识符,用于区分数据 IdTCPClient1.IOHandler.Write('BAAAAC',TIdTextEncoding.ASCII); end;
procedure TForm1.FormDestroy(Sender: TObject); begin FreeAndNil(ClientIPList); end;
procedure TForm1.FormShow(Sender: TObject); begin ClientIPList:=TList.Create; IdTCPServer1.Active:=True;
end;
procedure TForm1.IdTCPClient1Connected(Sender: TObject); begin //ShowMessage('连接客户端'); end;
procedure TForm1.IdTCPServer1Connect(AContext: TIdContext); begin
if Length(AContext.Binding.PeerIP)>5 then//AContext.Connection.Socket.Binding.PeerIP; ClientIPList.Add(AContext);
end;
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); var RData:TMData; buf:TIdBytes; sCmd:Char; sList:TStrings; I:Integer; ListCount:Integer; ss:string; begin //ACONTEXT.Connection.IOHandler.WriteLn('Recive Message!'); //AContext.Connection {sCmd := AContext.Connection.IOHandler.ReadChar; //先读取Char结构数据 if sCmd = #100 then //接收结构体 begin AContext.Connection.IOHandler.ReadBytes(buf,SizeOf(RData)); BytesToRaw(buf, RData, SizeOf(RData)); with Memo1.lines do begin Add('IP:'+AContext.Connection.Socket.Binding.PeerIP); Add('ID:'+Inttostr(RData.Id)); Add('Name:'+StrPas(RData.Name)); Add('Age:'+Inttostr(RData.age)); Add('UpdateTime:'+DateTimeToStr(RData.UpdateTime)); end; end //TCPClient.IOHandler.DefStringEncoding:=TEncoding.ASCII; else } //sCmd := AContext.Connection.IOHandler.ReadChar ; ss:=AContext.Connection.IOHandler.Readstring(AContext.Connection.IOHandler.InputBuffer.Size,TIdTextEncoding.ASCII ); if ss<>'' then Memo1.Lines.Add(ss); //AContext.Connection.IOHandler.InputBuffer.Size,
end;
procedure TForm1.Timer1Timer(Sender: TObject); var ss:string; begin ss:=IdTCPClient1.IOHandler.ReadString(IdTCPClient1.IOHandler.InputBuffer.Size); if ss<>'' then Edit1.Text:=ss;
end;
end.
-------------------------Unit结束------------- Delphi XE IdTCPClient1 和 IdTCPServer1 数据的发送与接收(indy10)_136.la https://www.136.la/shida/show-131002.html ----------------------------资料开始---------------------------------------------------------
1、IdTCPClient1 端 发送数据
1.1 发送结构体:
//定义结构体 TMData = record id:Integer; Name:Array[0..20] of Char; Age:Byte; UpdateTime:double; end;
//发送 procedure TForm2.Button2Click(Sender: TObject); var SendD: TMData; begin SendD.ID := 10; StrPCopy(SendD.Name, ‘Delphi 您好‘); SendData.age := 18; SendD.UpdateTime := Now; IdTCPClient1.IOHandler.Write(#100); //提前发送一个标识符,用于区分数据 IdTCPClient1.IOHandler.Write(RawToBytes(SendD, SizeOf(SendD))); end; 1.2 发送TStrings类型
procedure TForm2.Button3Click(Sender: TObject); var sList:TStrings; I:Integer; begin sList := TStringList.Create; for I :=0 to 50 do begin sList.Add(‘数据Test‘ + IntToStr(i)); end; IdTCPClient1.IOHandler.Write(#200); IdTCPClient1.IOHandler.Write(sList.Count); IdTCPClient1.IOHandler.Write(ToBytes(sList.Text,TIdTextEncoding.UTF8)); end; 1.3 发送一行字符串数据
procedure TForm2.Button4Click(Sender: TObject); begin IdTCPClient1.IOHandler.Write(#10); IdTCPClient1.IOHandler.Write(‘Delphi测试‘,TIdTextEncoding.UTF8); end;
2、IdTCPServer端 接收数据:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); var RData:TMData; buf:TIdBytes; sCmd:Char; sList:TStrings; I:Integer; ListCount:Integer; begin sCmd := AContext.Connection.IOHandler.ReadChar; //先读取Char结构数据 if sCmd = #100 then //接收结构体 begin AContext.Connection.IOHandler.ReadBytes(buf,SizeOf(RData)); BytesToRaw(buf, RData, SizeOf(RData)); with Memo1.lines do begin Add(‘ID:‘+Inttostr(RData.Id)); Add(‘Name:‘+StrPas(RData.Name)); Add(‘Age:‘+Inttostr(ReadData.age)); Add(‘UpdateTime:‘+DateTimeToStr(RData.UpdateTime)); end; end else if sCmd = #200 then //接收 TStrings begin ListCount := AContext.Connection.IOHandler.ReadLongInt; //ReadLongInt sList := TStringList.Create; try AContext.Connection.IOHandler.ReadStrings(sList,ListCount,TIdTextEncoding.UTF8); for I :=0 to sList.Count-1 do begin Memo1.Lines.Add(sList.Strings[I]); end; finally sList.Free; end; end else if sCmd = #10 then begin Memo1.Lines.Add(AContext.Connection.IOHandler.ReadString(AContext.Connection.IOHandler.InputBuffer.Size,TIdTextEncoding.UTF8) ); end else AContext.Connection.IOHandler.InputBuffer.Clear; //清除 end;
---------------------------资料结束---
---------------------------Form
object Form1: TForm1 Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 383 ClientWidth = 870 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False OnDestroy = FormDestroy OnShow = FormShow PixelsPerInch = 96 TextHeight = 13 object Button1: TButton Left = 32 Top = 272 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 0 OnClick = Button1Click end object Button2: TButton Left = 184 Top = 296 Width = 75 Height = 25 Caption = 'Button2' TabOrder = 1 end object Button3: TButton Left = 312 Top = 296 Width = 75 Height = 25 Caption = 'Button3' TabOrder = 2 end object Memo1: TMemo Left = 536 Top = 8 Width = 313 Height = 313 ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861 Lines.Strings = ( 'Memo1') TabOrder = 3 end object Button4: TButton Left = 536 Top = 350 Width = 75 Height = 25 Caption = 'Button4' TabOrder = 4 OnClick = Button4Click end object Button5: TButton Left = 288 Top = 350 Width = 75 Height = 25 Caption = 'Button5' TabOrder = 5 OnClick = Button5Click end object Edit1: TEdit Left = 184 Top = 328 Width = 321 Height = 21 ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861 TabOrder = 6 Text = 'Edit1' end object Button6: TButton Left = 32 Top = 304 Width = 75 Height = 25 Caption = 'Button6' TabOrder = 7 OnClick = Button6Click end object IdTCPServer1: TIdTCPServer Bindings = < item IP = '192.168.1.50' Port = 5050 end> DefaultPort = 0 OnConnect = IdTCPServer1Connect OnExecute = IdTCPServer1Execute Left = 288 Top = 48 end object IdTCPClient1: TIdTCPClient OnConnected = IdTCPClient1Connected ConnectTimeout = 1000 Host = '192.168.1.50' IPVersion = Id_IPv4 Port = 5050 ReadTimeout = 2000 Left = 104 Top = 40 end object Timer1: TTimer Enabled = False Interval = 100 OnTimer = Timer1Timer Left = 248 Top = 352 end object IdAntiFreeze1: TIdAntiFreeze Left = 88 Top = 104 end end
---------------------------Form
|
请发表评论