|
---------例子是XE的----
只是本人测试的,仅供学习!代码很乱!
在一个程序中测试 IdTcpClient和IdTcpServer有点坑,
测试的时候最好写Client和Server两个程序测试
--------------------
-------------------------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; Edit2: TEdit; 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 uses IdSchedulerOfThread; {$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; vv:TIdContext; 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); //---------------------------- //ShowMessage(IntToStr(TIdYarnOfThread(TIdContext(ClientIPList.Items[0]).Yarn).Thread.ThreadID)); //if TIdYarnOfThread(TIdContext(ClientIPList.Items[0]).Yarn).Thread.Suspended then //TIdYarnOfThread(TIdContext(ClientIPList.Items[0]).Yarn).Thread.Resume; ////vv:=TIdContext(ClientIPList.Items[0]); //TIdContext(ClientIPList.Items[0]).Connection.IOHandler.CheckForDisconnect(True, True); ////vv.Connection.IOHandler.DefStringEncoding := TIdTextEncoding.ASCII; //TIdContext(ClientIPList.Items[0]).Connection.IOHandler.Write('QAAAAN',TIdTextEncoding.ASCII); ////if vv.Connection.IOHandler.Opened then ////ShowMessage('已连接'); ////vv.Connection.Socket.Write('200: 数据接收成功!'); //啊啊啊啊啊啊啊啊,气死人了!测试了这么多,以为代码有问题!!!!在同一个进程中这玩意有问题, //建立客户端服务器两个程序的时候,这样的代码可以!妈耶!不知道什么情况!!! vv:=TIdContext(IdTCPServer1.Contexts.LockList.Items[0]); vv.Connection.IOHandler.Write('QAAAAN');
//------------------------------ //TIdTCPConnection(ClientIPList.Items[0]).SendCmd('888') ; finally //FreeAndNil(MyIdTCPConnection); //FreeAndNil(vIOHandler); IdTCPServer1.Contexts.UnlockList; 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); //TIdYarnOfThread(acontext.Yarn).Thread.ThreadID;
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 begin Memo1.Lines.Add(ss); //AContext.Connection.IOHandler.InputBuffer.Size, AContext.Connection.IOHandler.Write('88888888888',TIdTextEncoding.ASCII ); end;
end;
procedure TForm1.Timer1Timer(Sender: TObject); var ss:string; begin ss:=IdTCPClient1.IOHandler.ReadString(IdTCPClient1.IOHandler.InputBuffer.Size); Edit2.Text:=ss; if ss<>'' then Edit1.Text:=ss
//IdTCPClient1.IOHandler.InputBuffer.Clear; end;
end.
-------------------------------------- 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;
--------------------------Unit结束
----------------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 Edit2: TEdit Left = 369 Top = 354 Width = 96 Height = 21 ImeName = #20013#25991'('#31616#20307') - '#25628#29399#25340#38899#36755#20837#27861 TabOrder = 8 Text = 'Edit1' 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结束
-----------------------------------------------------------------------杂七杂八的小笔记------开始----------
-1----杂七杂八----开始
![]() ![]()
1 unit Unit1;
2
3 interface
4
5 uses
6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7 Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, ExtCtrls,
8 StdCtrls;
9
10 type
11 TFrmMainFiasSimulate = class(TForm)
12 IdTCP_Issue: TIdTCPClient;
13 IdTCP_PMS: TIdTCPClient;
14 Panel_Issue: TPanel;
15 Panel_PMS: TPanel;
16 GroupBox1: TGroupBox;
17 Memo1: TMemo;
18 Edit_IssueMessage: TEdit;
19 Button_SendMessage: TButton;
20 Edit_IssueIP: TEdit;
21 Edit_IssuePort: TEdit;
22 GroupBox2: TGroupBox;
23 Memo2: TMemo;
24 Edit2: TEdit;
25 Button1: TButton;
26 Edit_PMSIP: TEdit;
27 Edit_PMSPort: TEdit;
28 Button_Connect: TButton;
29 Button_DisConnect: TButton;
30 Timer_Issue: TTimer;
31 procedure Button_ConnectClick(Sender: TObject);
32 procedure Button_DisConnectClick(Sender: TObject);
33 procedure Button_SendMessageClick(Sender: TObject);
34 procedure Timer_IssueTimer(Sender: TObject);
35 private
36 { Private declarations }
37 public
38 { Public declarations }
39 end;
40
41 var
42 FrmMainFiasSimulate: TFrmMainFiasSimulate;
43
44 implementation
45
46 {$R *.dfm}
47
48 procedure TFrmMainFiasSimulate.Button_ConnectClick(Sender: TObject);
49 begin
50 IdTCP_Issue.Host:=Edit_IssueIP.Text;
51 IdTCP_Issue.Port:=StrToInt(Edit_IssuePort.Text);
52 IdTCP_Issue.Connect;
53 IdTCP_Issue.IOHandler.DefStringEncoding:=TEncoding.Unicode;//TEncoding.ASCII
54 end;
55
56 procedure TFrmMainFiasSimulate.Button_DisConnectClick(Sender: TObject);
57 begin
58 //IdTCP_Issue.Socket.Close;//IdTCP_Issue.Socket.InputBuffer.Clear;
59 IdTCP_Issue.DisConnect;
60 IdTCP_Issue.Socket.InputBuffer.Clear;//IdTCP_Issue.Socket.Close;
61 //IdTCP_Issue.Socket.CheckForDataOnSource()
62 end;
63
64 procedure TFrmMainFiasSimulate.Button_SendMessageClick(Sender: TObject);
65 begin
66 IdTCP_Issue.IOHandler.DefStringEncoding:=TEncoding.Unicode;//TEncoding.ASCII;//TEncoding.Unicode;
67 //IdTCP_Issue.IOHandler.Write(#1);
68 IdTCP_Issue.IOHandler.Write(Edit_IssueMessage.Text );
69 end;
70
71 procedure TFrmMainFiasSimulate.Timer_IssueTimer(Sender: TObject);
72 var
73 vs:string;
74 begin
75 try
76 if not IdTCP_Issue.Connected then
77 Exit;
78 vs:=IdTCP_Issue.IOHandler.ReadString(IdTCP_Issue.IOHandler.InputBuffer.Size ,TEncoding.Unicode);//有中文还是用 TEncoding.Unicode
79 //vs:=IdTCP_Issue.IOHandler.ReadString(IdTCP_Issue.IOHandler.InputBuffer.Size ,TEncoding.ASCII);
80 if vs<>'' then
81 Memo1.Lines.Add(vs) ;
82 except
83 //IdTCP_Issue.Socket.Close;
84 try
85 IdTCP_Issue.DisConnect;
86 IdTCP_Issue.Socket.InputBuffer.Clear ; //IdTCP_Issue.Socket.Close这里这么写不行
87 IdTCP_Issue.Connect;
88 except
89
90 end;
91
92 end;
93
94
95 end;
96
97 end.
View Code
-1----杂七杂八----结束
--2----杂七杂八----开始
![]() ![]()
1 unit Unit1;
2
3 interface
4
5 uses
6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7 Dialogs, IdContext, StdCtrls, IdBaseComponent, IdComponent, IdCustomTCPServer,
8 IdTCPServer;
9
10 type
11 TFrmMainIssueCard = class(TForm)
12 IdTCPServer1: TIdTCPServer;
13 Memo1: TMemo;
14 Button1_StartService: TButton;
15 Button2_Stop: TButton;
16 Edit_IP: TEdit;
17 Edit_Port: TEdit;
18 procedure IdTCPServer1Execute(AContext: TIdContext);
19 procedure IdTCPServer1Connect(AContext: TIdContext);
20 procedure FormShow(Sender: TObject);
21 procedure Button1_StartServiceClick(Sender: TObject);
22 procedure Button2_StopClick(Sender: TObject);
23 private
24 { Private declarations }
25 public
26 { Public declarations }
27 end;
28
29 var
30 FrmMainIssueCard: TFrmMainIssueCard;
31
32 implementation
33
34 uses
35 IdGlobal,IdSocketHandle;
36
37 {$R *.dfm}
38
39 procedure TFrmMainIssueCard.Button1_StartServiceClick(Sender: TObject);
40 var
41 vIdSocket:TIdSocketHandle;
42 begin
43 IdTCPServer1.Bindings.Clear;
44 vIdSocket:=IdTCPServer1.Bindings.Add;
45 //vIdSocket.IP:=Edit_IP.Text;
46 vIdSocket.Port:=StrToInt(Edit_Port.Text);
47 IdTCPServer1.Active:=True;
48 end;
49
50 procedure TFrmMainIssueCard.Button2_StopClick(Sender: TObject);
51 begin
52 IdTCPServer1.Active:=False;
53 end;
54
55 procedure TFrmMainIssueCard.FormShow(Sender: TObject);
56 begin
57 Memo1.Lines.Clear;
58 end;
59
60 procedure TFrmMainIssueCard.IdTCPServer1Connect(AContext: TIdContext);
61 begin
62 if Length(AContext.Binding.PeerIP)>5 then//AContext.Connection.Socket.Binding.PeerIP;
63 begin
64 AContext.Connection.IOHandler.DefStringEncoding:=TIdTextEncoding.Unicode;
65 Memo1.Lines.Add('用户连接IP:'+AContext.Binding.PeerIP);
66 AContext.Binding.Send('连接成功!',TIdTextEncoding.Unicode); //TIdTextEncoding.ASCII
67 end;
68
69 end;
70
71 procedure TFrmMainIssueCard.IdTCPServer1Execute(AContext: TIdContext);
72 var
73 sCmd:Char;
74 vs:string;
75 begin
76 //sCmd := AContext.Connection.IOHandler.ReadChar; //先读取Char结构数据
77 //if sCmd =#1 then
78
79 begin
80 vs:=AContext.Connection.IOHandler.Readstring(AContext.Connection.IOHandler.InputBuffer.Size,TIdTextEncoding.Unicode ); //TIdTextEncoding.Unicode
81 if vs<>'' then
82 begin
83 Memo1.Lines.Add(AContext.Connection.Socket.Binding.PeerIP+'-----此次会话开始--------');
84 Memo1.Lines.Add(vs); //AContext.Connection.IOHandler.InputBuffer.Size,
85 AContext.Connection.IOHandler.Write('您的消息服务器接收成功!',TIdTextEncoding.Unicode );
86 Memo1.Lines.Add(AContext.Connection.Socket.Binding.PeerIP+'-----此次会话结束--------');
87 end;
88 end;
89
90 end;
91
92 end.
View Code
--2----杂七杂八----结束
-----------------------------------------------------------------------杂七杂八的小笔记------结束----------
来源:https://www.cnblogs.com/dmqhjp/p/14765447.html |