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 ...
随机推荐
- IOSTimer的例子留个备注
1.创建一个定时器 ,以下是便利构造器方法,+ scheduledTimerWithTimeInterval:invocation:repeats:+ scheduledTimerWithTimeIn ...
- Wince 中如何实现注册表恢复原厂设置
理论: 使用HIVE注册表,系统在完成了第一阶段也就是加载完了boot.hv+binfs之后和加载系统HIVE注册表之前,filesys.exe都会调用OEMIoControl来查询是否需要清除保存在 ...
- R语言日期时间函数
Sys.Date( ) returns today's date. date() returns the current date and time.# print today's datetoday ...
- 进程间通信机制<转>
1 文件映射 文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待.因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容. ...
- Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝
一.为驳回编译器自动提供的机能,可将相应成员函数声明为private并且不予实现.(如果你仅仅是自己不实现的话,编译器会帮你实现) 如: class A { public: A(const strin ...
- js风格技巧
1.一个页面的所有js都可以写成这样,比如: var index ={}; index.User = ****; index.Init = function(){ $("$tes ...
- bzoj2466: [中山市选2009]树
同上一题.(应该可以树形dp,然而我不会... #include<cstdio> #include<cstring> #include<iostream> #inc ...
- FileZilla无法确定拖放操作的目标,由于shell未正确安装
天有不测风云,突然间,用filezilla下载ftp上的文件到桌面的时候,提示"无法确定拖放操作目标.由于shell未正确安装" 解决办法很简单,执行如下几步就OK了 1.在CMD ...
- ASP.NET MVC @helper使用说明
简单的 @helper 方法应用场景 Razor中的@helper语法让您能够轻松创建可重用的方法,此方法可以在您的视图模板中封装输出功能.他们使代码能更好地重用,也使代码更具有可读性. 在我们定义@ ...
- VI使用的小白教程
vi 使用方法vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强 大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,v ...