idTCPServer与idTCPClient的使用问题。发送字符与流的混合方式使用???(200分)

  • 主题发起人 主题发起人 xuegaoyili
  • 开始时间 开始时间
X

xuegaoyili

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在想用这两个控件做一个简单的C/S,
服务器端通过idTCPServer做接收,主要是先接收一个字符串说明,然后再接收一个流。
再然后返给客户端一个字符串。
客户端是通过idTCPClient做连接,先是发一字符串说明,然后发流,然后接收服务器给的
字符串。
我是这样写的,
var
sData: string;
i: integer;
buf : TMemoryStream;
begin
// Client.host := '127.0.0.1'
// Client.port := 7777
// Client.Connect(5000);

buf := TMemoryStream.Create;
try
buf.SetSize(10240);
FillMemory(buf.Memory, buf.Size, 66);
Client.WriteLn('tttt');
Client.WriteStream(buf);
//发送文件 ,true,true
rData:=Client.ReadLn();
finally
buf.Free;
end;

服务器端是
var
buf: TMemoryStream;
FileName:string;

size:longint;
st,et:DWord;
begin
FileName:=athread.Connection.ReadLn;
listbox1.Items.Add('开始:'+FileName);
buf := TMemoryStream.Create;
//('c:/rev.txt', fmCreate)
buf.SetSize(10241);
buf.Position :=0;
st := GetTickCount();
listbox1.Items.Add('准备接收:');
AThread.Connection.ReadStream(buf,-1,false);
listbox1.Items.Add('收到文件大小:'+IntToStr(buf.Size));
et := GetTickCount();
buf.Free;
listbox1.Items.Add('下面回发:');
AThread.Connection.WriteLn(IntToStr(et-st));
listbox1.Items.Add('用时:'+IntToStr(et-st));
现在的情况是,这样的设计,因为是使用阻塞模式,成死锁状态。
 
你把timeout时间设置一下,如果阻塞了,就跳出异常处理就不会死锁了的
ReadStream(buf,-1,false)改为ReadStream(buf,timeout,false);timeout设置个合理点的时间
 
后退
顶部