Delphi实例-IdTCPServer和IdTCPClient的使用(支持文件发送)

//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 = 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; //连接服务器
  //必须连接成功后才可以,放前面会报错
  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 := '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;

//发送字符串(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.

猜你喜欢

转载自blog.csdn.net/xyzhan/article/details/87281314