Coder, Length (s) 
Добавлено @ 14:45 кусок из рабочего проекта.
клиент:
| Код | const nCount = 32; var Xml, s: widestring; Buf: array [0..nCount - 1] of char; i, Size, Count: integer; ss: TWinSocketStream; begin .. cs.Active := TRUE; // открываем сокет (TClientSocket) cs.Socket.SendText (ChildNode.xml); // отправлям текст ss := TWinSocketStream.Create(cs.Socket, 60000); // создаём поток для чтения ответа от сервера try Xml := ''; // будущий ответ ss.WaitForData(10000); // ждём не дольше 10 секунд ss.Read(Size, 2); // читаем первые два байта Count := 0; repeat FillChar (Buf, nCount, #0); // обнуляем буфер ss.WaitForData(10000); // ждём порцию данных Count := Count + ss.Read(Buf, nCount); // считаем, сколько прочитано всего Xml := Xml + Buf; // формируем результат until Count = Size; // и так пока всё не вычитаем. finally ss.Free; end; ..
|
сервер:
| Код | procedure TService1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket); var InXml, OutXml: string; Size: integer; begin InXml := Socket.ReceiveText; Request (InXml, OutXml); Size := LEngth (OutXml); // OutXml := 'Answering at ' + InXml; Socket.SendBuf(Size, 2); Socket.SendText(OutXml); end;
|
здесь сервер висит в сервисе, и является не-блокирующим, а вот клиент - блокирующий, и после каждого вызова он ждёт ответа, не возвращая управления. для этого на клиенте и создаётся поток. |