Delphi - TClientSocket ReceiveText MaxLen?

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

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

3 ответа

Решение

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;

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

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

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;

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

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

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

Другие вопросы по тегам