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

相关资料:

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

结果注意:

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

实例代码:

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

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

Delphi实例之一个较复杂的记事本的实现

Delphi实例之一个较复杂的记事本的实现 by Chaobs 一.概述 前几天在学习Delphi时照着书上的练习做了一个记事本程序,自己略加改进,将过程记录下来也是方便初学者学习,其中多有错误还望指点. 功能: (1).基本实现了Windows自带的记事本的功能: (2).具有字体设置.字体颜色和自动排版的设计: (3).加入了日历的功能. 运行界面(UI做的很丑诃): 设计思想: 通过Delphi组件中的RichEdit实现文本的编辑,OepnDialog和SaveDialog用于打开和保存

Delphi实例之橡皮筋画图的实现

Delphi实例之橡皮筋画图的实现 在<Delphi7基础教程>这本书的练习中提到过一个橡皮筋画图的例子,书上的源码是错误的!不知道是打印的错误还是本身源码就有问题,我将它改了过来. 在Form1上放置一个Image组件,Image1的Align设为Client. 1 unit Unit1; 2 3 interface 4 5 6 uses 7 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Delphi实例之一个简易的浏览器的实现

Delphi实例之一个简易的浏览器的实现 Delphi7的WebBrowser组件提供了很多不错的网页设计的功能,下面做一个简单的浏览器.组件很简单按照下面摆放就行了. 这是运行后的效果 源代码 主页面 1 unit Unit1; 2 3 interface 4 5 uses 6 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 7 Dialogs, StdCtrls, Buttons, ComC

调用DLL窗体-Delphi实例

(一)通过向导DLL Wizard新建一个动态链接库,取名为:DLLPro.dpr.说明:当在DLL工程文件中使用了String类型时,要有 uses ShareMem ,不过建议使用PChar类型.其代码如下: library DLLPro; //编译生成DLLPro.dll文件. uses ActiveX, Forms, Windows, SysUtils, Classes, DLLUnt in 'DLLUnt.pas'; {$R *.res} var DllApp:TApplication

最新的支持DELPHI XE7的多层插件式开发框架

DATASNAP中间件: 中间件已经在好几个实际项目中应用,长时间运行异常稳定,可无人值守: 可编译环境:DELPHI XE5~DELPHI XE7,无需变动代码: 支持传统TCP/IP方式也支持REST: 传统TCP/IP客户端支持长连接也支持短连接: 数据库连接对象,中间件服务对象,数据集对象等对象全部采用对象池处理: 支持负载均衡集群,有代理服务器专门处理客户端的连接申请,客户端并发处理不再是问题: 详尽的日志记录,异常情况方便查询: 客户端插件框架: 所有模块都是以BPL包的形式存在,每

老陈---谈Delphi中SSL协议的应用[转]

摘要:本文主要介绍如何在Delphi中使用SSL协议.一共分为七个部分:(1)SSL协议是什么?(2)Delphi中如何使用SSL协议?(3)SSL客户端编程实例.(4)SSL服务端编程实例.(5)SSL证书编程实例.(6)中间人欺骗实例.(7)其它.本文作者同时有一个用SSL协议编写的作品叫SSLPROXY,感兴趣的读者可以从作者主页http://www.138soft.org下载. 一:SSL协议是什么?  SSL是一种加密传输协议.引用网上一段话:SSL 是Secure socket La

谈Delphi中SSL协议的应用(好多相关文章)

摘要:本文主要介绍如何在Delphi中使用SSL协议.一共分为七个部分:(1)SSL协议是什么?(2)Delphi中如何使用SSL协议?(3)SSL客户端编程实例.(4)SSL服务端编程实例.(5)SSL证书编程实例.(6)中间人欺骗实例.(7)其它.本文作者同时有一个用SSL协议编写的作品叫SSLPROXY,感兴趣的读者可以从作者主页http://www.138soft.org下载. 一:SSL协议是什么?  SSL是一种加密传输协议.引用网上一段话:SSL 是Secure socket La

Delphi Indy和socket的一些区别

关于INDY--DELPHI的Internet控件集 Delphi 2010 中包含了大量的Indy控件,网上找点资料转到博客下面给大家分享下. 你有没有用DELPHI开发Internet程序?是不是常常会烦恼FastNet组件为什么没有源代码?有很多问题,不看源代码,真不知道是什么问题.是不是也觉得FastNet组件支持的网络协议还不够多?现在不用烦恼了,有一套功能很丰富.使用很方便.开放源代码的免费INTERNET控件集可以解决你的烦恼.这套控件集就是INDY了. 什么是INDY?它有什么功

Delphi的组件读写机制

Delphi的组件读写机制(一) 一.流式对象(Stream)和读写对象(Filer)的介绍在面向对象程序设计中,对象式数据管理占有很重要的地位.在Delphi中,对对象式数据管理的支持方式是其一大特色. Delphi是一个面向对象的可视化设计与面向对象的语言相结合的集成开发环境.Delphi的核心是组件.组件是对象的一种.Delphi应用程序完全是由组件来构造的,因此开发高性能的Delphi应用程序必然会涉及对象式数据管理技术. 对象式数据管理包括两方面的内容:● 用对象来管理数据● 对各类数