Delphi 2009,Indy 10,TIdTCPServer.OnExecute,如何抓取InputBuffer中的所有字节
我正在摆弄 Delphi 2009 提供的 Indy 10,并且在 OnExecute 触发时无法从 IOHandler 获取所有数据......
procedure TFormMain.IdTCPServerExecute(AContext: TIdContext);
var
RxBufStr: UTF8String;
RxBufSize: Integer;
begin
if AContext.Connection.IOHandler.Readable then
begin
RxBufSize := AContext.Connection.IOHandler.InputBuffer.Size;
if RxBufSize > 0 then
begin
SetLength(RxBufStr, RxBufSize);
AContext.Connection.IOHandler.ReadBytes(TBytes(RxBufStr), RxBufSize, False);
end;
end;
end;
AContext.Connection.IOHandler.InputBuffer.Size 似乎不可靠并且经常返回 0,但是在下次通过 OnExecute 运行时,它将获取正确的字节数,但为时已晚。
本质上,我希望能够获取所有数据,将其填充到 UTF8String(不是 Unicode 字符串)中,然后解析特殊标记。 所以我没有标题,消息的长度是可变的。 看来 Indy 10 IOHandlers 没有为此设置,或者我只是使用错误。
最好做一些事情,比如传递一定大小的缓冲区,尽可能填充它并返回实际填充的字节数,然后如果有更多字节则继续。
顺便说一句 TIdSchedulerOfFiber 的状态是什么,这看起来很有趣,它有效吗? 有人使用吗? 我注意到它并不在 Delphi 2009 的标准安装中。
更新:我发现 Msg := AContext.Connection.IOHandler.ReadLn(#0, enUTF8); 这是可行的,但我仍然想知道上述问题的答案,是因为它是基于阻塞IO的吗? 这使得人们更加热衷于这个 TIdSchedulerOfFiber。
I am messing around with the Indy 10 supplied with Delphi 2009 and am having trouble with getting all the data from the IOHandler when OnExecute fires...
procedure TFormMain.IdTCPServerExecute(AContext: TIdContext);
var
RxBufStr: UTF8String;
RxBufSize: Integer;
begin
if AContext.Connection.IOHandler.Readable then
begin
RxBufSize := AContext.Connection.IOHandler.InputBuffer.Size;
if RxBufSize > 0 then
begin
SetLength(RxBufStr, RxBufSize);
AContext.Connection.IOHandler.ReadBytes(TBytes(RxBufStr), RxBufSize, False);
end;
end;
end;
AContext.Connection.IOHandler.InputBuffer.Size doesn't seem reliable and often returns 0, but on the next run throug the OnExecute it'll pick up the right number of bytes, but that is too late.
Essentially I want to be able to just grab all the data, stuff it into a UTF8String (not a Unicode string) and then parse for a special marker. So I have no headers and messages are variable length. It seems the Indy 10 IOHandlers are not setup for this or I am just using it wrong.
It would be nice to do something like pass a buffer of a certain size, fill it as much as possible and return the number of bytes actually filled and then keep going if there are more.
As an aside what's the status of TIdSchedulerOfFiber, this looks very interesting, does it work? Is anyone using it? I notice that it isn't in the standard install of Delphi 2009 though.
Update: I found Msg := AContext.Connection.IOHandler.ReadLn(#0, enUTF8); which works but I still would like to know the answer to the above question, is it because it is based on blocking IO? Which makes even more keen on this TIdSchedulerOfFiber.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你不应该这样使用 Readable() 。 请尝试以下操作:
或者:
至于 TIdSchedulerOfFiber - SuperCore 包此时实际上已失效。 它已经很长时间没有开发了,并且没有与最新的 Indy 10 架构保持同步。 我们可能会尝试在以后恢复它,但这不在我们近期的计划中。
You should not be using Readable() like that. Try the following instead:
Alternatively:
As for TIdSchedulerOfFiber - the SuperCore package is effectively dead at this time. It has not been worked on in a very long time, and is not up-to-date with the latest Indy 10 architecture. We may try to resurrect it at a later date, but it is not in our plans for the near future.