服务端用TIdTCPServer,客户端用TClientSocket会不会有问题?(50分)

  • 主题发起人 主题发起人 8541051
  • 开始时间 开始时间
8

8541051

Unregistered / Unconfirmed
GUEST, unregistred user!
我的服务端用的是TIdTCPServer控件,客户端用的是TClientSocket控件,是万不得已的。理论上是没有问题的,但是数据量大的时候往往会出现一些问题,TClientSocket接收的时候会多受到一个信息,经测试这个信息是个空的值,我的代码如下,高手请看一下问题在哪里。
客户端:
with TClientSocket.Create(nil) do
//with TIdTCPClient.Create(nil) do
try
Host := Form1.NewServerIp;
Port := Form1.NewServerPort;
ClientType := ctBlocking;
try
Open;
//Connect ;
//showmessage(inttostr(Sizeof(NewDataOr)));
Socket.SendBuf(NewDataOr, Sizeof(NewDataOr));
Socket.ReceiveBuf(R,Sizeof(R));
Form1.Edit1.Text := IntToStr(StrToInt(Form1.Edit1.Text)+1);
//WriteBuffer(NewDataOr, Sizeof(NewDataOr));
//ReadBuffer(R,4);
//Disconnect;
//Socket.Close;
Close ;
except
on E:Exception do
begin
if E.Message <> 'Connection Closed Gracefully.' then
begin
Form1.glog.WriteLog('向接口网关发送彩票数据失败!卡号:'+CardId +',原因:'+ E.Message, True); //写入log文件中
mstr := '向接口网关发送彩票数据失败!卡号:'+CardId +',原因:'+ E.Message;
Synchronize(DisplayMemo);
DataResponseHead^.Flag := 10; //返回结果10

Result := 1;
//Socket.Close;
Close ;
exit;
end;
//exit;
end;
end;
finally
Free;
end;
if R='0000' then //‘0000’是成功
begin
DataResponseHead^.Flag := 0;
Result := 0;
Form1.Edit3.Text := IntToStr(Zs*2+StrToInt(Form1.Edit3.Text));
exit;
end;
if R='' then //问题出在这里,不应该有''
begin
Form1.Edit2.Text := IntToStr(StrToInt(Form1.Edit2.Text)+1);
Form1.glog.WriteLog('接口网关回执空值,卡号:'+CardId +','+IntTostr(Zs)+'注', True); //写入log文件中
mstr := '接口网关回执空值!卡号:'+CardId +','+IntTostr(Zs)+'注';//+R+ManId+DQ+Pwd+PlayName;
Synchronize(DisplayMemo);
DataResponseHead^.Flag := 10; //返回结果10
Result := 9;
Exit;
end;
服务端:TIdTCPServer的OnExecute事件
……
R := '0000';
LogMsg := '向合并专用机发送票数据成功!卡号:'+Pn^.PhoneCordNo;
WriteLog(AThread.ThreadID,ListBox1.Items,LogMsg); //写日值,没问题
AThread.Connection.WriteBuffer(R,Sizeof(R));
注:R为array [0..3] of Char;
 
你开的接收延时为多少?有可能在数据量量大小,你端口忙不过来的情况下,如果超过你所设的延时时间,是会反回空值的,这是正常现像。此时,你要加以判断。如你代码中一样,不然要加长接收延时,这样在接收为空时,Socket会再等待久些。
 
应该设立一个信号量,每收到一笔数据就将信号量置为false,直到将这次收到的数据写入文件后,再允许下一个收到的数据写入。当然,每次收数据时,可以用建立一个缓冲数组来保存。
 
后退
顶部