我一直在尝试设置从ReceiveText TClientSocket函数中恢复的字符数量的长度,但似乎没有任何效果。例如,从恢复的数据或其他数据流接收第一个最左边的字符。有没有办法在Delphi中使用这个特定的对象来完成这个任务?
我会很感激你的帮助。提前谢谢。
发布于 2012-02-08 17:42:35
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;发布于 2012-02-08 07:58:03
以下是发送和接收文本的小tipp。
首先,您也必须发送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;希望这能帮你..。
发布于 2012-02-08 07:10:22
我不在家使用Delphi,但是一个快速的Google搜索发现了此页,它表明ReceiveText不接受任何参数,而是返回尽可能多的字符串。
您可能需要的可能是ReceiveBuf而不是。
https://stackoverflow.com/questions/9188685
复制相似问题