码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2015-12-17 18:52:58      阅读:317      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

 

相关资料:

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.

 

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

标签:

原文地址:http://www.cnblogs.com/FKdelphi/p/5054853.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!