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 ...
随机推荐
- SGU 275 To xor or not to xor (高斯消元)
题目链接 题意:有n个数,范围是[0, 10^18],n最大为100,找出若干个数使它们异或的值最大并输出这个最大值. 分析: 一道高斯消元的好题/ 我们把每个数用二进制表示,要使得最后的异或值最大, ...
- poj 1191 棋盘分割(dp + 记忆化搜索)
题目:http://poj.org/problem?id=1191 黑书116页的例题 将方差公式化简之后就是 每一块和的平方 相加/n , 减去平均值的平方. 可以看出来 方差只与 每一块的和的平方 ...
- HDU 4893 线段树
比赛时太大意,斐波拉契数列开小了. 题目大意:1个序列,3种操作,改变序列某个数大小,将序列中连续的一段每个数都变成其最近的斐波拉契数,以及查询序列中某一段的数之和. 解题思路:维护add[]数组表示 ...
- Exception in thread "main" java.lang.NoClassDefFoundError: UDP_Receive (wrong na me: com/ray/net/UDP_Receive)
一.事件经过 今晚学习java网络编程,在eclipse中写了两个个java文件,一个发送端UDP_Send2.java,一个接收端UDP_Receive.java.实现发送端键盘录入信息,通过UDP ...
- this class is not key value coding-compliant for the key ##
setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key ## 出现以上错误时很恶心,并 ...
- 最简单的视音频播放示例4:Direct3D播放RGB(通过Texture)
本文接着上一篇文章继续记录Direct3D(简称D3D)播放视频的技术.上一篇文章中已经记录了使用Direct3D中的Surface渲染视频的技术.本文记录一种稍微复杂但是更加灵活的渲染视频的方式:使 ...
- 【CSS】使用CSS改变超链接样式
超链接代码 <ahrefahref="http://www.divCSS5.com/"target="_blank" title="关于divC ...
- @section Right
布局页 _BaseLayout.cshtml @RenderSection("Right", true) 视图页 Index.cshtml @{ Layout = "~/ ...
- 再一次见证mssql中in 与exist的区别
见下面代码 /*+' select * from '+@strDBName +'.dbo.m_aic where nodeid not in(select nodeid from @tmpAIC) ' ...
- java AES加密算法
package com.siro.tools; import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import j ...