• 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。

     

    实例代码: 

      1 //Use IdContext,IdGlobal这两个单元
      2 //不能使用string类型,在分存分配时会出错的。
      3 
      4 unit Unit1;
      5 
      6 interface
      7 
      8 uses
      9   System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
     10   FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ScrollBox,
     11   FMX.Memo, FMX.Controls.Presentation, FMX.StdCtrls, IdTCPConnection,
     12   IdTCPClient, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer,
     13   IdContext, IdIOHandler, Data.DBByteBuffer, IdGlobal, FMX.Edit, FMX.Objects;
     14 
     15 //常量区
     16 const
     17   ServerPort = 1239;
     18 
     19 //基础数据类型
     20 
     21 //方案一:手机不支持这种的
     22 //type
     23 //  TUser = record
     24 //    UserName,UserID:String[20];
     25 //    IP:String[16];
     26 //    Port:Integer;
     27 //    Msg:String[100];
     28 //    Arr:Array[1..9] of String[20];
     29 //    flag:Boolean;
     30 //    Cmd:String[20];
     31 //end;
     32 
     33 //方案二:手机PC都支持
     34 type
     35   TUser = record
     36     UserName, UserID:String;
     37     IP: String;
     38     Port: Integer;
     39     Msg: String;
     40     Arr: Array[1..9] of String;
     41     flag: Boolean;
     42     Cmd: String;
     43 end;
     44 
     45 
     46 //方案三:记录指针
     47 TSMSHead = packed record
     48   SequenceID: Integer;
     49   CommandID: Integer;
     50   TotalLength: Integer;
     51 end;
     52 PSMSHead = ^TSMSHead;
     53 
     54 TSMSConnect = packed record
     55   Head: TSMSHead;
     56   UID: array[0..19] of char;
     57   PWD: array[0..19] of char;
     58   Version: Byte;
     59 end;
     60 PSMSConnect = ^TSMSConnect;
     61 
     62 
     63 
     64 type
     65   TForm1 = class(TForm)
     66     IdTCPServer1: TIdTCPServer;
     67     IdTCPClient1: TIdTCPClient;
     68     Button1: TButton;
     69     Button2: TButton;
     70     Button3: TButton;
     71     Button4: TButton;
     72     Memo1: TMemo;
     73     Label1: TLabel;
     74     Button5: TButton;
     75     Button6: TButton;
     76     Edit1: TEdit;
     77     Label3: TLabel;
     78     Image1: TImage;
     79     procedure Button3Click(Sender: TObject);
     80     procedure IdTCPServer1Connect(AContext: TIdContext);
     81     procedure Button4Click(Sender: TObject);
     82     procedure Button5Click(Sender: TObject);
     83     procedure Button6Click(Sender: TObject);
     84     procedure IdTCPServer1Execute(AContext: TIdContext);
     85     procedure Button1Click(Sender: TObject);
     86     procedure Button2Click(Sender: TObject);
     87   private
     88     { Private declarations }
     89   public
     90     { Public declarations }
     91     FileSize: Int64;//发送文件时用到,保存文件大小。
     92   end;
     93 
     94 var
     95   Form1: TForm1;
     96 
     97 implementation
     98 
     99 {$R *.fmx}
    100 {$R *.SmXhdpiPh.fmx ANDROID}
    101 {$R *.NmXhdpiPh.fmx ANDROID}
    102 
    103 //连接服务器
    104 procedure TForm1.Button3Click(Sender: TObject);
    105 begin
    106   IdTCPClient1.Host:= Edit1.Text; //服务器的IP
    107   IdTCPClient1.Port:= ServerPort; //服务器的端口
    108   IdTCPClient1.Connect; //连接服务器
    109   //必须连接成功后才可以,放前面会报错
    110   IdTCPClient1.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8(); //中文处理
    111 end;
    112 
    113 //连接提示
    114 procedure TForm1.IdTCPServer1Connect(AContext: TIdContext);
    115 begin
    116   AContext.Connection.IOHandler.DefStringEncoding := IndyTextEncoding_UTF8(); //中文处理
    117   Memo1.Lines.Add('有用户连接');
    118   Memo1.Lines.Add('');
    119 end;
    120 
    121 //记录类型(TIdBytes)
    122 procedure TForm1.Button4Click(Sender: TObject);
    123 var
    124   User: TUser;
    125   sby: TIdBytes;
    126 begin
    127   with user do
    128   begin
    129     UserName := 'Wyatt';
    130     UserID := '7895421';
    131     Ip:= '192.168.1.188';
    132     Port := 9999;
    133     Msg := 'ABC';
    134     cmd := 'Quit';
    135   end;
    136   sBy := RawTOBytes(user, sizeof(user));
    137   IdTCPClient1.IOHandler.Write(sBy);
    138 end;
    139 
    140 //记录类型(TMemoryStream)
    141 procedure TForm1.Button5Click(Sender: TObject);
    142 var
    143   User: TUser;
    144   Mon: TMemoryStream;
    145 begin
    146   with user do
    147   begin
    148     UserName := 'Wyatt';
    149     UserID := '85171659';
    150     Ip := '192.168.1.188';
    151     Port := 9999;
    152     Msg := '4567';
    153     cmd := 'Quit';
    154   end;
    155   Mon := TMemoryStream.Create;
    156   try
    157     Mon.WriteBuffer(user, sizeof(user));
    158     IdTCPClient1.IOHandler.Write(Mon);
    159   finally
    160     Mon.Free;
    161   end;
    162 end;
    163 
    164 //记录指针(TIdBytes)
    165 procedure TForm1.Button1Click(Sender: TObject);
    166 var
    167   pkt: TSMSConnect;
    168   buf: TIdBytes;
    169 begin
    170   // 填写pkt
    171   pkt.Head.SequenceID := 1000;
    172   pkt.Head.CommandID := 119;
    173   StrLCopy(pkt.UID, 'I love you 你好', SizeOf(pkt.UID));
    174   // ...
    175   // 准备缓冲区数据
    176   SetLength(buf, SizeOf(TSMSConnect));
    177   Move(pkt, buf[0], SizeOf(TSMSConnect));
    178   IdTCPClient1.Socket.Write(buf);
    179 end;
    180 
    181 //发送文件(TFileStream)
    182 procedure TForm1.Button2Click(Sender: TObject);
    183 var
    184   oTmpStream: TFileStream;
    185 begin
    186   Try
    187     oTmpStream := TFileStream.Create('E:123.jpg', fmOpenRead);
    188     oTmpStream.Position := 0;
    189     FileSize := oTmpStream.Size;
    190     IdTCPClient1.IOHandler.Write(oTmpStream);
    191     oTmpStream.Free;
    192   except
    193     //
    194   end;
    195 end;
    196 
    197 //Byte方法(未实现)
    198 procedure TForm1.Button6Click(Sender: TObject);
    199 const
    200   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);
    201 var
    202   ReqBuf, RespBuf: TIdBytes;
    203   I: Integer;
    204 begin
    205   SetLength(ReqBuf, 33);
    206   for I := 0 to Length(ReqBuf) - 1 do
    207   begin
    208     ReqBuf[I] := data[I];
    209   end;
    210   try
    211     IdTCPClient1.IOHandler.Write(ReqBuf);
    212   except
    213     on e: Exception do
    214     begin
    215       ShowMessage('发送' + e.Message);
    216       Exit;
    217     end;
    218   end;
    219 end;
    220 
    221 //发送字符串(string)
    222 procedure TForm1.Button7Click(Sender: TObject);
    223 begin
    224 //发送文本
    225   IdTCPClient1.IOHandler.writeln(Memo1.Text);
    226 end;
    227 
    228 procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
    229 //接收string字符串
    230 var
    231   TempStr: string;
    232 begin
    233   //服务器接收
    234   TempStr := AContext.Connection.IOHandler.ReadLn;
    235   Memo1.Lines.Add(TempStr);
    236 
    237 ////接收文件流
    238 //var
    239 //  omStream: TMemoryStream;
    240 //begin
    241 //  omStream := TMemoryStream.Create;
    242 //  AContext.Connection.IOHandler.ReadStream(omStream, FileSize);
    243 //  omStream.SaveToFile('E:1.jpg');
    244 //  omStream.Free;
    245 
    246 //接收记录类型(TIdBytes)
    247 //var
    248 //  user: TUser;
    249 //  buf: TidBytes;
    250 //begin
    251 //  Acontext.Connection.IOHandler.ReadBytes(buf, sizeof(user));
    252 //  BytesToRaw(buf, user, sizeof(user));
    253 //  with user, memo1.Lines do
    254 //  begin
    255 //    Add(userName);
    256 //    add(userID);
    257 //    add(ip);
    258 //    add(inttostr(port));
    259 //    add(Msg);
    260 //    add(cmd);
    261 //    add('');
    262 //  end;
    263 
    264 //接收记录类型(TMemoryStream)
    265 //var
    266 //  user: TUser;
    267 //  Mon: TMemoryStream;
    268 //begin
    269 //  Mon := TMemoryStream.Create;
    270 //  try
    271 //    AContext.Connection.IOHandler.ReadStream(Mon);
    272 //    Mon.ReadBuffer(user, Sizeof(user)); //Indy 10必须将记录类型转换为TidBytes类型才能发送
    273 //    with user, memo1.Lines do
    274 //    begin
    275 //      Add(userName);
    276 //      add(userID);
    277 //      add(ip);
    278 //      add(inttostr(port));
    279 //      add(Msg);
    280 //      add(cmd);
    281 //      add('');
    282 //    end;
    283 //  finally
    284 //    Mon.Free;
    285 //  end;
    286 
    287 //接收记录指针(TIdBytes)
    288 //var
    289 //  pkt: PSMSConnect;
    290 //  buf: TIdBytes;
    291 //begin
    292 //  SetLength(buf, SizeOf(TSMSConnect));
    293 //  AContext.Connection.Socket.ReadBytes(buf, SizeOf(TSMSConnect), False);
    294 //  pkt := PSMSConnect(@buf[0]);
    295 //  Assert(pkt.Head.SequenceID = 1000);
    296 //  Memo1.Lines.Add(pkt.UID);
    297 //  Memo1.Lines.Add('');
    298 end;
    299 
    300 end.
    View Code

     

  • 相关阅读:
    2021.6.2 Python网络编程
    2021.6.1 数据库
    2021.5.29 PHP大作业
    2021.5.28 bootstrap和vue
    2021.5.27 三个和尚
    2021.5.26 Python操作Mysql数据库
    2021.5.25 PHP作业
    2021.5.24 Python解析XML
    如何用 GPU 训练模型?
    44 内核中的中断处理(上)
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/5054853.html
Copyright © 2020-2023  润新知