热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Delphi实例-IdTCPServer和IdTCPClient的使用(支持文件发送)

相关资料:http:blog.csdn.netearbaoarticledetails46514313http:blog.csdn.netlin_strongarti

 

相关资料:

http://blog.csdn.net/earbao/article/details/46514313

 

http://blog.csdn.net/lin_strong/article/details/51592093

 

 

结果注意:

1.Use IdContext、IdGlobal 这两个单元
2.不能使用string类型,在分存分配时会出错的。
3.手机中不支持string[20]。
4.中文会乱码,必须设置IndyTextEncoding_UTF8。

 

实例代码: 

 

  1 //Use IdContext,IdGlobal这两个单元
2 //不能使用string类型,在分存分配时会出错的。
3
4 unit Unit1;
5
6 interface
7
8 uses
9 System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
10 FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ScrollBox,
11 FMX.Memo, FMX.Controls.Presentation, FMX.StdCtrls, IdTCPConnection,
12 IdTCPClient, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer,
13 IdContext, IdIOHandler, Data.DBByteBuffer, IdGlobal, FMX.Edit, FMX.Objects;
14
15 //常量区
16 const
17 ServerPort = 1239;
18
19 //基础数据类型
20
21 //方案一:手机不支持这种的
22 //type
23 // TUser = record
24 // UserName,UserID:String[20];
25 // IP:String[16];
26 // Port:Integer;
27 // Msg:String[100];
28 // Arr:Array[1..9] of String[20];
29 // flag:Boolean;
30 // Cmd:String[20];
31 //end;
32
33 //方案二:手机PC都支持
34 type
35 TUser = record
36 UserName, UserID:String;
37 IP: String;
38 Port: Integer;
39 Msg: String;
40 Arr: Array[1..9] of String;
41 flag: Boolean;
42 Cmd: String;
43 end;
44
45
46 //方案三:记录指针
47 TSMSHead = packed record
48 SequenceID: Integer;
49 CommandID: Integer;
50 TotalLength: Integer;
51 end;
52 PSMSHead = ^TSMSHead;
53
54 TSMSCOnnect= packed record
55 Head: TSMSHead;
56 UID: array[0..19] of char;
57 PWD: array[0..19] of char;
58 Version: Byte;
59 end;
60 PSMSCOnnect= ^TSMSConnect;
61
62
63
64 type
65 TForm1 = class(TForm)
66 IdTCPServer1: TIdTCPServer;
67 IdTCPClient1: TIdTCPClient;
68 Button1: TButton;
69 Button2: TButton;
70 Button3: TButton;
71 Button4: TButton;
72 Memo1: TMemo;
73 Label1: TLabel;
74 Button5: TButton;
75 Button6: TButton;
76 Edit1: TEdit;
77 Label3: TLabel;
78 Image1: TImage;
79 procedure Button3Click(Sender: TObject);
80 procedure IdTCPServer1Connect(AContext: TIdContext);
81 procedure Button4Click(Sender: TObject);
82 procedure Button5Click(Sender: TObject);
83 procedure Button6Click(Sender: TObject);
84 procedure IdTCPServer1Execute(AContext: TIdContext);
85 procedure Button1Click(Sender: TObject);
86 procedure Button2Click(Sender: TObject);
87 private
88 { Private declarations }
89 public
90 { Public declarations }
91 FileSize: Int64;//发送文件时用到,保存文件大小。
92 end;
93
94 var
95 Form1: TForm1;
96
97 implementation
98
99 {$R *.fmx}
100 {$R *.SmXhdpiPh.fmx ANDROID}
101 {$R *.NmXhdpiPh.fmx ANDROID}
102
103 //连接服务器
104 procedure TForm1.Button3Click(Sender: TObject);
105 begin
106 IdTCPClient1.Host:= Edit1.Text; //服务器的IP
107 IdTCPClient1.Port:= ServerPort; //服务器的端口
108 IdTCPClient1.Connect; //连接服务器
109 //必须连接成功后才可以,放前面会报错
110 IdTCPClient1.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8(); //中文处理
111 end;
112
113 //连接提示
114 procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
115 begin
116 AContext.Connection.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8(); //中文处理
117 Memo1.Lines.Add('有用户连接');
118 Memo1.Lines.Add('');
119 end;
120
121 //记录类型(TIdBytes)
122 procedure TForm1.Button4Click(Sender: TObject);
123 var
124 User: TUser;
125 sby: TIdBytes;
126 begin
127 with user do
128 begin
129 UserName := 'Wyatt';
130 UserID := '7895421';
131 Ip:= '192.168.1.188';
132 Port := 9999;
133 Msg := 'ABC';
134 cmd := 'Quit';
135 end;
136 sBy := RawTOBytes(user, sizeof(user));
137 IdTCPClient1.IOHandler.Write(sBy);
138 end;
139
140 //记录类型(TMemoryStream)
141 procedure TForm1.Button5Click(Sender: TObject);
142 var
143 User: TUser;
144 Mon: TMemoryStream;
145 begin
146 with user do
147 begin
148 UserName := 'Wyatt';
149 UserID := '85171659';
150 Ip := '192.168.1.188';
151 Port := 9999;
152 Msg := '4567';
153 cmd := 'Quit';
154 end;
155 Mon := TMemoryStream.Create;
156 try
157 Mon.WriteBuffer(user, sizeof(user));
158 IdTCPClient1.IOHandler.Write(Mon);
159 finally
160 Mon.Free;
161 end;
162 end;
163
164 //记录指针(TIdBytes)
165 procedure TForm1.Button1Click(Sender: TObject);
166 var
167 pkt: TSMSConnect;
168 buf: TIdBytes;
169 begin
170 // 填写pkt
171 pkt.Head.SequenceID := 1000;
172 pkt.Head.CommandID := 119;
173 StrLCopy(pkt.UID, 'I love you 你好', SizeOf(pkt.UID));
174 // ...
175 // 准备缓冲区数据
176 SetLength(buf, SizeOf(TSMSConnect));
177 Move(pkt, buf[0], SizeOf(TSMSConnect));
178 IdTCPClient1.Socket.Write(buf);
179 end;
180
181 //发送文件(TFileStream)
182 procedure TForm1.Button2Click(Sender: TObject);
183 var
184 oTmpStream: TFileStream;
185 begin
186 Try
187 oTmpStream := TFileStream.Create('E:\123.jpg', fmOpenRead);
188 oTmpStream.Position := 0;
189 FileSize := oTmpStream.Size;
190 IdTCPClient1.IOHandler.Write(oTmpStream);
191 oTmpStream.Free;
192 except
193 //
194 end;
195 end;
196
197 //Byte方法(未实现)
198 procedure TForm1.Button6Click(Sender: TObject);
199 const
200 data: array[0..32] of Byte = (23, 32, 3, 1, 23, 25, 0, 8, 0, 86, 49, 46, 48, 46, 48, 46, 48, 4, 0, 57, 48, 50, 53, 5, 0, 77, 65, 67, 80, 67, 1, 12, 15);
201 var
202 ReqBuf, RespBuf: TIdBytes;
203 I: Integer;
204 begin
205 SetLength(ReqBuf, 33);
206 for I := 0 to Length(ReqBuf) - 1 do
207 begin
208 ReqBuf[I] := data[I];
209 end;
210 try
211 IdTCPClient1.IOHandler.Write(ReqBuf);
212 except
213 on e: Exception do
214 begin
215 ShowMessage('发送' + e.Message);
216 Exit;
217 end;
218 end;
219 end;
220
221 //发送字符串(string)
222 procedure TForm1.Button7Click(Sender: TObject);
223 begin
224 //发送文本
225 IdTCPClient1.IOHandler.writeln(Memo1.Text);
226 end;
227
228 procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
229 //接收string字符串
230 var
231 TempStr: string;
232 begin
233 //服务器接收
234 TempStr := AContext.Connection.IOHandler.ReadLn;
235 Memo1.Lines.Add(TempStr);
236
237 ////接收文件流
238 //var
239 // omStream: TMemoryStream;
240 //begin
241 // omStream := TMemoryStream.Create;
242 // AContext.Connection.IOHandler.ReadStream(omStream, FileSize);
243 // omStream.SaveToFile('E:\01.jpg');
244 // omStream.Free;
245
246 //接收记录类型(TIdBytes)
247 //var
248 // user: TUser;
249 // buf: TidBytes;
250 //begin
251 // Acontext.Connection.IOHandler.ReadBytes(buf, sizeof(user));
252 // BytesToRaw(buf, user, sizeof(user));
253 // with user, memo1.Lines do
254 // begin
255 // Add(userName);
256 // add(userID);
257 // add(ip);
258 // add(inttostr(port));
259 // add(Msg);
260 // add(cmd);
261 // add('');
262 // end;
263
264 //接收记录类型(TMemoryStream)
265 //var
266 // user: TUser;
267 // Mon: TMemoryStream;
268 //begin
269 // Mon := TMemoryStream.Create;
270 // try
271 // AContext.Connection.IOHandler.ReadStream(Mon);
272 // Mon.ReadBuffer(user, Sizeof(user)); //Indy 10必须将记录类型转换为TidBytes类型才能发送
273 // with user, memo1.Lines do
274 // begin
275 // Add(userName);
276 // add(userID);
277 // add(ip);
278 // add(inttostr(port));
279 // add(Msg);
280 // add(cmd);
281 // add('');
282 // end;
283 // finally
284 // Mon.Free;
285 // end;
286
287 //接收记录指针(TIdBytes)
288 //var
289 // pkt: PSMSConnect;
290 // buf: TIdBytes;
291 //begin
292 // SetLength(buf, SizeOf(TSMSConnect));
293 // AContext.Connection.Socket.ReadBytes(buf, SizeOf(TSMSConnect), False);
294 // pkt := PSMSConnect(@buf[0]);
295 // Assert(pkt.Head.SequenceID = 1000);
296 // Memo1.Lines.Add(pkt.UID);
297 // Memo1.Lines.Add('');
298 end;
299
300 end.
View Code

 

 

 

 

 


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
  • 第一步:PyQt4Designer设计程序界面该部分设计类同VisvalStudio内的设计,改下各部件的objectName!设计 ... [详细]
author-avatar
lailin2025
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有