Delphi - TClientSocket ReceiveText MaxLen?

时间:2012-02-08 06:19:58

标签: delphi sockets tclientsocket

我一直在尝试设置从ReceiveText TClientSocket函数中恢复的字符数量的长度,似乎没有任何效果。例如,从恢复的数据或其他数据流接收第一个最左边的字符。有没有办法在Delphi中使用这个特定的对象来完成这个?

非常感谢帮助。提前谢谢。

3 个答案:

答案 0 :(得分:1)

这里有一个发送和接收文本的小tipp

首先你必须发送你的文字长度

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 :(得分:1)

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;

答案 2 :(得分:0)

我不在家中使用Delphi,但是快速的Google搜索显示this page表明ReceiveText不接受任何参数,而是返回一个尽可能多的字符串

您可能需要的是ReceiveBuf