Indy + TStringList

Author:Perl
    在用INDY写网络程序的时候,因为在IDTCPCLIENT中是没有EXECUTE事件去接收IDTCPSERVER发送过来的数据的,最笨的办法就是在CLIENT做一个TIMER循环接收数据,但是这样有两个坏处:
    一、会掉包。
    二、要处理一些特殊字符。本文就是针对解决这个问题给出一个比较好的解决办法。
            例如在CLIENT的TIMER中,通常我们会在开头写下如下代码:
            var
              TempStr:String;
            begin
              TempStr:=TCPC.ReadLn('',5);
               if TempStr<>'' then begin
                 //我们的程序处理代码
               end;
            end;
             这段代码正常数据的接收是很正常的,但是如果在接收的时候遇到空格,那么INDY就会产生异常(有人举手说了:“用try...except括起来。”那可不行,因为程序在这时候已经停止了数据的接收工作,就算用异常的结构将它包住,唯一的好处就是自己看少几个异常错误的弹出窗口,呵呵~),那么怎么解决了,因为本人愚笨,所以用笨办法写了一对函数用来解决类似的收发问题。函数原型如下:
//发送数据的函数
Procedure SendTStringList(Client: TIdTCPClient; CharCount: Integer; MMLines: TMemo);
Var
  I: Integer;
  ClientList: TStringList;
Begin
  ClientList := TStringList.Create;

  For I := 0 To CharCount - 1 Do Begin
    ClientList.add(MMLines.Lines[I]);
  End;

  Client.WriteInteger(ClientList.Count);

  For I := 0 To ClientList.Count - 1 Do
  Begin
    Client.WriteLn(ClientList.Strings[I]);
  End;
End;

//接收数据的函数
Procedure RecvTStringList(AThread: TIdPeerThread; MM: TMemo);
Var
  I, Count: Integer;
  ClientList: TStringList;
Begin
  ClientList := TStringList.Create;
  Count := AThread.Connection.ReadInteger();
  For I := 0 To Count - 1 Do Begin
    ClientList.add(AThread.Connection.ReadLn());
    MM.Lines.add(ClientList.Strings[I]);
  End;
End;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值