我一直在尝试设置从ReceiveText
TClientSocket函数中恢复的字符数量的长度,似乎没有任何效果。例如,从恢复的数据或其他数据流接收第一个最左边的字符。有没有办法在Delphi中使用这个特定的对象来完成这个?
非常感谢帮助。提前谢谢。
答案 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。