请帮看下这小段代码哪里有问题?IdTCPClient、IdTCPServer传输数据 ( 积分: 20 )

  • 主题发起人 主题发起人 cnhotel
  • 开始时间 开始时间
C

cnhotel

Unregistered / Unconfirmed
GUEST, unregistred user!
服务端有多条记录,我想一次性传回给客户端!有没有其它什么方法也可以实现呢?

服务端:
procedure TfrmMain.IdTCPServerExecute(AThread: TIdPeerThread);
var cmd:String;
DList:TStringList;
Stream1:TMemoryStream;
begin
cmd:=Athread.Connection.ReadLn;
if cmd='testdata' then
begin
//获取数据,肯定有记录
DList:=TStringList.Create;
Stream1:= TMemoryStream.Create;
ADOQuery1.SQL.Text:='select top 3 uname from usertable';
ADOQuery1.Open;
while not ADOquery1.Eof do
begin
Dlist.Add(ADOQuery1.fieldbyname('jldwmc').AsString);
ADOQuery1.Next;
end;
Dlist.SaveToStream(Stream1);
Stream1.Position := 0;
AThread.Connection.WriteStream(Stream1);
end;
end;

客户端:
procedure TfrmMain.Button3Click(Sender: TObject);
var Stream1:TMemoryStream;
DList:TStringList;
i:Integer
begin
IdTCPClient.WriteLn('testdata');
Stream1:=TMemoryStream.Create;
DList:=TStringList.Create;
i:=Idtcpclient.ReadFromStack(True,-2,True);
if i>0 then
begin
IdTCPClient.ReadStream(Stream1,i);
Stream1.Position:=0;
Dlist.LoadFromStream(Stream1);
if Dlist.Count>0 then //值为0,没有接收到服务器返回的值了,为什么?
begin
ShowMessage('ok');
end else ShowMessage('null');
end;
end;
 
IdTCPClient.ReadStream(Stream1,sizeof(Stream1));
后面你用sizeof(Stream1),太搞笑啦~~~~
你没懂这个参数的意思?
解决方法,服务端先发一个长度信息过来,也就是Stream1.Size
客户端先接收长度信息,当后面那个参数(替换sizeof(Stream1))
 
刚才那个错误的地方这样替换
可以么?

i:=Idtcpclient.ReadFromStack(True,-2,True);
if i>0 then
begin
IdTCPClient.ReadStream(Stream1,i);
Dlist.LoadFromStream(Stream1);
Stream1.Position:=0;
if Dlist.Count>0 then
begin
ShowMessage('ok');
end else ShowMessage('null');
end;

Dlist.Count还是返回0...
 
解决了
一个是楼上帮指正的,另外一个是Stream1.Position:=0;顺序放反了
 
接受答案了.
 
后退
顶部