Delphi - TClientSocket ReceiveText MaxLen? - PullRequest
       22

Delphi - TClientSocket ReceiveText MaxLen?

3 голосов
/ 08 февраля 2012

Я пытался установить длину количества символов, которые вы восстанавливаете с помощью функции ReceiveText TClientSocket, и, похоже, ничего не работает. Например, получение первого крайнего левого символа (символов) из восстановленных данных или другого потока данных. Есть ли способ сделать это в Delphi, используя этот конкретный объект?

Помощь будет высоко ценится. Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 08 февраля 2012

Вот небольшой совет для отправки и получения текста

сначала вы должны отправить также длину текста yout

Socket.SendText(IntToStr(Length(text)) + seperator + text);

, затем вы можете проверить на своем сокете сервера при получении потоков данных, если ваш входящий текст завершен

procedure TMyServer.OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  if (xRecLength = 0) then begin
    if Length(Socket.ReceiveText) <= 0 then EXIT;
    xRecLength:= StrToIntDef(GetFirstFromSplitted(Socket.ReceiveText, seperator), -1);
    if xRecLength = -1 then EXIT;
  end;
  xActLength:= xActLength + Length(Socket.ReceiveText);
  xRecPuffer:= xRecPuffer + Socket.ReceiveText;

  isComplete:= xActLength = xRecLength;
  if isComplete then begin
    // complete text received
  end;
end;

надеюсь, что это поможет вам ...

1 голос
/ 08 февраля 2012

ReceiveText не имеет средств для контроля максимальной длины получаемого текста.

Самый простой способ в режиме ClientType := ctBlocking - использовать TWinSocketStream, так как документация гласит:

http://docwiki.embarcadero.com/VCL/XE2/en/ScktComp.TClientSocket.ClientType

Когда ClientType имеет значение ctBlocking, используйте объект TWinSocketStream для чтения и записи. TWinSocketStream предотвращает зависание приложения на неопределенный срок, если возникает проблема при чтении или записи. Он также может подождать, пока соединение сокета покажет свою готовность к чтению.

Пример кода:

var
  Stream : TWinSocketStream;
  Buffer : TBytes;
  S      : string;
begin
  SetLength(Buffer, 100); // 100 bytes buffer size
  Stream := TWinSocketStream.Create(Socket, 5000); // 5 seconds or 5000 milliseconds
  try
    Stream.ReadBuffer(Buffer[0], Length(Buffer)); // raises an Exception if it couldn't read the number of bytes requested
    S := TEncoding.Default.GetString(Buffer); // Works in Delphi 2009+
  finally
    Stream.Free;
  end;
end;
0 голосов
/ 08 февраля 2012

Я не дома с Delphi, но быстрый поиск в Google обнаружил эту страницу , которая указывает, что ReceiveText не принимает никаких параметров, но вместо этого возвращает строку столько, сколько можетпрочитайте.

Вместо этого вам может понадобиться ReceiveBuf .

...