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;