您的位置:首页 > 理论基础 > 计算机网络

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: