Delphi实例-IdTCPServer和IdTCPClient的使用(支持文件发送)
2015-12-17 17:52
846 查看
相关资料:
http://blog.csdn.net/earbao/article/details/46514313
结果注意:
1.Use IdContext、IdGlobal 这两个单元
2.不能使用string类型,在分存分配时会出错的。
3.手机中不支持string[20]。
实例代码:
unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ScrollBox, FMX.Memo, FMX.Controls.Presentation, FMX.StdCtrls, IdTCPConnection, IdTCPClient, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer, IdContext, IdIOHandler, Data.DBByteBuffer, IdGlobal, FMX.Edit, FMX.Objects; //常量区 const ServerPort = 1239; //基础数据类型 //方案一:手机不支持这种的 //type // TUser = record // UserName,UserID:String[20]; // IP:String[16]; // Port:Integer; // Msg:String[100]; // Arr:Array[1..9] of String[20]; // flag:Boolean; // Cmd:String[20]; //end; //方案二:手机PC都支持 type TUser = record UserName, UserID:String; IP: String; Port: Integer; Msg: String; Arr: Array[1..9] of String; flag: Boolean; Cmd: String; end; //方案三:记录指针 TSMSHead = packed record SequenceID: Integer; CommandID: Integer; TotalLength: Integer; end; PSMSHead = ^TSMSHead; TSMSConnect = packed record Head: TSMSHead; UID: array[0..19] of char; PWD: array[0..19] of char; Version: Byte; end; PSMSConnect = ^TSMSConnect; type TForm1 = class(TForm) IdTCPServer1: TIdTCPServer; IdTCPClient1: TIdTCPClient; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Memo1: TMemo; Label1: TLabel; Button5: TButton; Button6: TButton; Edit1: TEdit; Label3: TLabel; Image1: TImage; procedure Button3Click(Sender: TObject); procedure IdTCPServer1Connect(AContext: TIdContext); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure IdTCPServer1Execute(AContext: TIdContext); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } FileSize: Int64;//发送文件时用到,保存文件大小。 end; var Form1: TForm1; implementation {$R *.fmx} {$R *.SmXhdpiPh.fmx ANDROID} {$R *.NmXhdpiPh.fmx ANDROID} //连接服务器 procedure TForm1.Button3Click(Sender: TObject); begin IdTCPClient1.Host:= Edit1.Text; //服务器的IP IdTCPClient1.Port:= ServerPort; //服务器的端口 IdTCPClient1.Connect; //连接服务器 end; //连接提示 procedure TForm1.IdTCPServer1Connect(AContext: TIdContext); begin Memo1.Lines.Add('有用户连接'); Memo1.Lines.Add(''); end; //记录类型(TIdBytes) procedure TForm1.Button4Click(Sender: TObject); var User: TUser; sby: TIdBytes; begin with user do begin UserName := 'Wyatt'; UserID := '7895421'; Ip:= '192.168.1.188'; Port := 9999; Msg := 'ABC'; cmd := 'Quit'; end; sBy := RawTOBytes(user, sizeof(user)); IdTCPClient1.IOHandler.Write(sBy); end; //记录类型(TMemoryStream) procedure TForm1.Button5Click(Sender: TObject); var User: TUser; Mon: TMemoryStream; begin with user do begin UserName := 'Wyatt'; UserID := '85171659'; Ip := '192.168.1.188'; Port := 9999; Msg := '4567'; cmd := 'Quit'; end; Mon := TMemoryStream.Create; try Mon.WriteBuffer(user, sizeof(user)); IdTCPClient1.IOHandler.Write(Mon); finally Mon.Free; end; end; //记录指针(TIdBytes) procedure TForm1.Button1Click(Sender: TObject); var pkt: TSMSConnect; buf: TIdBytes; begin // 填写pkt pkt.Head.SequenceID := 1000; pkt.Head.CommandID := 119; StrLCopy(pkt.UID, 'I love you 你好', SizeOf(pkt.UID)); // ... // 准备缓冲区数据 SetLength(buf, SizeOf(TSMSConnect)); Move(pkt, buf[0], SizeOf(TSMSConnect)); IdTCPClient1.Socket.Write(buf); end; //发送文件(TFileStream) procedure TForm1.Button2Click(Sender: TObject); var oTmpStream: TFileStream; begin Try oTmpStream := TFileStream.Create('E:\123.jpg', fmOpenRead); oTmpStream.Position := 0; FileSize := oTmpStream.Size; IdTCPClient1.IOHandler.Write(oTmpStream); oTmpStream.Free; except // end; end; //Byte方法(未实现) procedure TForm1.Button6Click(Sender: TObject); const 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); var ReqBuf, RespBuf: TIdBytes; I: Integer; begin SetLength(ReqBuf, 33); for I := 0 to Length(ReqBuf) - 1 do begin ReqBuf[I] := data[I]; end; try IdTCPClient1.IOHandler.Write(ReqBuf); except on e: Exception do begin ShowMessage('发送' + e.Message); Exit; end; end; end; procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); //接收文件流 var omStream: TMemoryStream; begin omStream := TMemoryStream.Create; AContext.Connection.IOHandler.ReadStream(omStream, FileSize); omStream.SaveToFile('E:\01.jpg'); omStream.Free; //接收记录类型(TIdBytes) //var // user: TUser; // buf: TidBytes; //begin // Acontext.Connection.IOHandler.ReadBytes(buf, sizeof(user)); // BytesToRaw(buf, user, sizeof(user)); // with user, memo1.Lines do // begin // Add(userName); // add(userID); // add(ip); // add(inttostr(port)); // add(Msg); // add(cmd); // add(''); // end; //接收记录类型(TMemoryStream) //var // user: TUser; // Mon: TMemoryStream; //begin // Mon := TMemoryStream.Create; // try // AContext.Connection.IOHandler.ReadStream(Mon); // Mon.ReadBuffer(user, Sizeof(user)); //Indy 10必须将记录类型转换为TidBytes类型才能发送 // with user, memo1.Lines do // begin // Add(userName); // add(userID); // add(ip); // add(inttostr(port)); // add(Msg); // add(cmd); // add(''); // end; // finally // Mon.Free; // end; //接收记录指针(TIdBytes) //var // pkt: PSMSConnect; // buf: TIdBytes; //begin // SetLength(buf, SizeOf(TSMSConnect)); // AContext.Connection.Socket.ReadBytes(buf, SizeOf(TSMSConnect), False); // pkt := PSMSConnect(@buf[0]); // Assert(pkt.Head.SequenceID = 1000); // Memo1.Lines.Add(pkt.UID); // Memo1.Lines.Add(''); end; end.
相关文章推荐
- TCPCOPY 1.0 安装使用
- ftp桥接到http服务
- 深入解析开源项目之Retrofit(一)使用篇
- 老李秘技:loadrunner回放脚本错误提示Error: "HTTP Status-Code 500"
- 12-《电子入门趣谈》第二章_电子电路的神经网络-2.1.3三极管(重点推荐)
- 构造HTTP请求Header实现“伪造来源IP”(重在原理)
- servlet获取httpPost请求中的JSON数据
- Android佳博网络打印机例子
- 老李分享:HTTP协议之协议头
- TCP/IP、Http、Socket的区别
- win10搜索不到无线网络,手机打开热点也连不上怎么解决?
- 网络新闻评论观点挖掘系统实现
- 初识贝叶斯网络
- 再学贝叶斯网络--TAN树型朴素贝叶斯算法
- http相关
- 有关在线OJ网络AC爬虫
- 网络参考模型 七层-四层
- 完美配置Tomcat的HTTPS
- Android访问Https双向认证API
- Nginx下配置网站ssl实现https访问