Delphi实例-IdTCPServer和IdTCPClient的使用(支持文件发送)
相关资料:
http://blog.csdn.net/earbao/article/details/46514313
http://blog.csdn.net/lin_strong/article/details/51592093
http://blog.sina.com.cn/s/blog_44fa172f0102uxs8.html //indy10的idtcpserver 获取对方IP、端口和本机线程ID
结果注意:
1.Use IdContext、IdGlobal 这两个单元
2.不能使用string类型,在分存分配时会出错的。
3.手机中不支持string[20]。
4.中文会乱码,必须设置IndyTextEncoding_UTF8。
实例代码:
//Use IdContext,IdGlobal这两个单元
//不能使用string类型,在分存分配时会出错的。 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 = ; //基础数据类型 //方案一:手机不支持这种的
//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[..] 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[..] of char;
PWD: array[..] 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; //连接服务器
//必须连接成功后才可以,放前面会报错
IdTCPClient1.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8(); //中文处理
end; //连接提示
procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
begin
AContext.Connection.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8(); //中文处理
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 := '';
Ip:= '192.168.1.188';
Port := ;
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 := '';
Ip := '192.168.1.188';
Port := ;
Msg := '';
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 := ;
pkt.Head.CommandID := ;
StrLCopy(pkt.UID, 'I love you 你好', SizeOf(pkt.UID));
// ...
// 准备缓冲区数据
SetLength(buf, SizeOf(TSMSConnect));
Move(pkt, buf[], 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 := ;
FileSize := oTmpStream.Size;
IdTCPClient1.IOHandler.Write(oTmpStream);
oTmpStream.Free;
except
//
end;
end; //Byte方法(未实现)
procedure TForm1.Button6Click(Sender: TObject);
const
data: array[..] of Byte = (, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , );
var
ReqBuf, RespBuf: TIdBytes;
I: Integer;
begin
SetLength(ReqBuf, );
for I := to Length(ReqBuf) - 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; //发送字符串(string)
procedure TForm1.Button7Click(Sender: TObject);
begin
//发送文本
IdTCPClient1.IOHandler.writeln(Memo1.Text);
end; procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
//接收string字符串
var
TempStr: string;
begin
//服务器接收
TempStr := AContext.Connection.IOHandler.ReadLn;
Memo1.Lines.Add(TempStr); ////接收文件流
//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.
Delphi实例-IdTCPServer和IdTCPClient的使用(支持文件发送)的更多相关文章
- (转载)delphi实例TDBGrid用右键菜单复制行粘贴行
delphi实例TDBGrid用右键菜单复制行粘贴行 这个从本质上来说就是DBGrid后台数据库的插入 右键复制当前行的相关数据到临时变量点粘贴时,覆盖数据或插入数据! db为数据库: 字段名id,n ...
- Delphi实例之一个简易的浏览器的实现
Delphi实例之一个简易的浏览器的实现 Delphi7的WebBrowser组件提供了很多不错的网页设计的功能,下面做一个简单的浏览器.组件很简单按照下面摆放就行了. 这是运行后的效果 源代码 主页 ...
- Delphi实例之橡皮筋画图的实现
Delphi实例之橡皮筋画图的实现 在<Delphi7基础教程>这本书的练习中提到过一个橡皮筋画图的例子,书上的源码是错误的!不知道是打印的错误还是本身源码就有问题,我将它改了过来. 在F ...
- Delphi实例之绘制正弦函数图像
Delphi实例之绘制正弦函数图像 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphic ...
- Delphi阿里云邮件推送【支持单一发信、邮件批量发送和获取指定条件下的发送数据】
作者QQ:(648437169) 点击下载➨Delphi阿里云邮件推送 阿里云api文档 [Delphi阿里云邮件推送]支持SingleSendMail(单一发信接口). ...
- Delphi RSA签名与验签【支持SHA1WithRSA(RSA1)、SHA256WithRSA(RSA2)和MD5WithRSA签名与验签】
作者QQ:(648437169) 点击下载➨ RSA签名与验签 [delphi RSA签名与验签]支持3种方式签名与验签(SHA1WithRSA(RSA1).SHA256WithRSA(RSA2)和M ...
- Delphi阿里云对象存储OSS【支持上传文件、下载文件、删除文件、创建目录、删除目录、Bucket操作等】
作者QQ:(648437169) 点击下载➨Delphi阿里云对象存储OSS 阿里云api文档 [Delphi阿里云对象存储OSS]支持 获取Bucket列表.设置Bucket ...
- Delphi中对BCD码的直接支持 (转)
最近在Delphi下写软件,需要将数据转换为BCD码和将BCD码转换为其它数据类型,从网上搜索了一下,没有发现好的函数,于是就想自定义函数来完成BCD与其它格式的数据转换功能.但最终没有动手写,先查查 ...
- Delphi实例之一个较复杂的记事本的实现
http://www.mamicode.com/info-detail-110813.html delphi中控件位置及自动排版的问题 http://blog.csdn.net/avan_lau/ar ...
随机推荐
- Support Library官方教程(3)android studio中导入支援包
Support Library Setup How you setup the Android Support Libraries in your development project depend ...
- sublime-text3插件安装
sublime-text3和sublime-text2一样安装插件前都需要先安装,Package control ,然而安装Package control的代码和sublime-text2又不相同.如 ...
- POJ 2455 - Secret Milking Machine
原题地址:http://poj.org/problem?id=2455 题目大意:给出一个N个点的无向图,中间有P条边,要求找出从1到n的T条通路,满足它们之间没有公共边,并使得这些通路中经过的最长的 ...
- [转] Jquery滚动加载
原文地址:http://hi.baidu.com/vipxiaofan/item/9eb927b795671f77254b0985 另外一个asp.net的例子:http://blog.csdn.ne ...
- HDU 1233 还是畅通工程(最小生成树,prim)
题意:中文题目 思路:prim实现,因为有n*(n-1)/2条边,已经是饱和的边了,prim比较合适. (1)将点1置为浏览过,点1可以到达其他每个点,所以用low[i]数组记录下目前到达i点的最小长 ...
- 移动开发之浅析cocos2d-x的中文支持问题
题记:这阵子一直在学习cocos2d-x,其跨平台的特性确实让人舒爽,引擎的框架概念也很成熟,虽然相应的第三方工具略显单薄,但也无愧是一件移动开发的利器啊,有兴趣的朋友有时间就多了解吧. 使用引擎的过 ...
- 搞明白这八个问题,Linux系统就好学多了。
正在犹豫入坑Linux学习的同学或者已经入坑的同学,经常会问到这样八个问题.今天,这些问题我都会一一解答,希望我的看法能帮助各位同学.常言道“好的开始是成功的一半”,如果你明白了以下八个问题,就能有一 ...
- 《Python 学习手册4th》 第十章 Python语句简介
''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容 (每天看42页内容,可以保证月底看完此书) “重点 ...
- angular form-data文件上传
前言:很久没更新博客,最近公司pc端技术选型用angular,这几天就赶鸭子上架,硬着头皮直接上手angular.其中有许多小坑陆陆续续踩起走.今天就遇到一个比较常见的问题:图片上传. 主题:图片上传 ...
- 某酒店2000W数据
某酒店2000W数据 2000万开房信息 [某酒店2000w数据 ct2000(解压密码:sjisauisa是就数据8很舒适好sjjss).rar] 国内安全漏洞监测平台乌云(WooYun.org)近 ...