Delphi 2009,Indy 10,TIdTCPServer.OnExecute,如何抓取InputBuffer中的所有字节

2023-11-23

我正在摆弄 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 中(notUnicode 字符串),然后解析特殊标记。所以我没有标题,消息的长度是可变的。看来 Indy 10 IOHandlers 没有为此设置,或者我只是使用错误。

最好做一些事情,比如传递一定大小的缓冲区,尽可能填充它并返回实际填充的字节数,然后如果有更多字节则继续。

顺便说一句 TIdSchedulerOfFiber 的状态是什么,这看起来很有趣,它有效吗?有人使用吗?我注意到它并不在 Delphi 2009 的标准安装中。

Update:我发现 Msg := AContext.Connection.IOHandler.ReadLn(#0, enUTF8);这是可行的,但我仍然想知道上述问题的答案,是因为它是基于阻塞IO的吗?这使得人们更加热衷于这个 TIdSchedulerOfFiber。


你不应该这样使用 Readable() 。请尝试以下方法:

procedure TFormMain.IdTCPServerExecute(AContext: TIdContext);
var
  RxBuf: TIdBytes;
begin
  RxBuf := nil;
  with AContext.Connection.IOHandler do
  begin
    CheckForDataOnSource(10);
    if not InputBufferIsEmpty then
    begin
      InputBuffer.ExtractToBytes(RxBuf);
      // process RxBuf as needed...
    end;
  end;
end;

或者:

procedure TFormMain.IdTCPServerExecute(AContext: TIdContext);
var
  RxBufStr: String; // not UTF8String
begin
  with AContext.Connection.IOHandler do
  begin
    CheckForDataOnSource(10);
    if not InputBufferIsEmpty then
    begin
      RxBufStr := InputBuffer.Extract(-1, enUtf8);

      // Alternatively to above, you can set the
      // InputBuffer.Encoding property to enUtf8
      // beforehand, and then call TIdBuffer.Extract()
      // without any parameters.
      //
      // Or, set the IOHandler.DefStringEncoding
      // property to enUtf8 beforehand, and then
      // call TIdIOHandler.InputBufferAsString()

      // process RxBufStr as needed...
    end;
  end;
end;

至于 TIdSchedulerOfFiber - SuperCore 包此时实际上已经死亡。它已经很长时间没有开发了,并且没有与最新的 Indy 10 架构保持同步。我们可能会尝试在以后恢复它,但这不在我们近期的计划中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi 2009,Indy 10,TIdTCPServer.OnExecute,如何抓取InputBuffer中的所有字节 的相关文章

  • 我如何在Delphi中处理事件?

    例如 我有一个程序 在单击 Button1 后执行某些操作 如果没有 Button1Click 中的代码 如何处理按钮的 onclick 事件 我需要为 Button1 动态添加事件 unit Unit1 interface uses Wi
  • TDictionary 上的 GetItem 由链接器消除

    我正在使用一个TDictionary of
  • Word 2010 自动化:“转到书签”

    我有一个用 Delphi 7 编写的程序 它打开一个基于模板的新 Word 文档 文档打开后 系统会自动跳转到书签 在模板中预定义 并在其中添加一些文本 以下代码在 Word 2003 中工作正常 但会导致invalid variant o
  • 具有 csOwnerDrawFixed 样式的组合框如何表现得像 csDropDown 样式?

    我正在使用一个组合框 http docwiki embarcadero com Libraries en Vcl StdCtrls TComboBoxstyle 属性设置为的组件csOwnerDrawFixed 我实现了绘图项一切工作正常
  • 在 Delphi 中使用 XML(将特定数据返回到变量)

    过去几天我一直在尝试使用 Delphi 2010 和 MSXML 我是一个极端的新手 需要一点指导 var MemoryStream TMemoryStream XMLPath String sName String XMLDoc vari
  • 石和磅的格式正确吗?

    我有一个图表 用于显示重量 以英石和磅 lbs 为单位 该图表由记录中的数据填充 对于权重 数据类型为 Double 记录数据是在运行时编辑的 我需要知道一种正确格式化输入数据的方法 为了更好地理解 首先看一下这些示例值 它们表示为石和磅
  • delphi中如何实现多重继承?

    我正在对一个旧库进行完全重写 我不确定如何处理这种情况 为了便于理解 大家都欢呼自行车类比 我有以下课程 TBike 自行车本身 TBikeWheel 自行车的一个轮子 TBikeWheelFront and TBikeWheelBack
  • 如何更改 TPageControl 上标签的方向?

    我是 Delphi 的新手 再次强调 我在 1994 年就使用过 Delphi 我现在有 Delphi 2009 Pro 来自Java 我发现对象继承非常晦涩 我的用户想要选项卡位于左侧的选项卡式页面 但是 TPageControl 不允许
  • Delphi 5 中的 Oracle 数据库连接

    我正在使用 Delphi 5 版本 我想连接到 Oracle 数据库 我有 TDatabase 组件 我不知道如何通过 Delphi 连接到数据库 请提供连接数据库的步骤 谢谢 The TDatabase http docwiki emba
  • Delphi 6 命令行编译:无 DCU

    当对 dpr 文件使用 dcc32 时 它会生成一个 dll 但不会生成 dcu 项目级别 cfg 使用 N 开关设置路径 但指定的目录中没有任何内容 当 E 开关正在工作时 它必须看到 cfg 我尝试在调用 dcc32 之前对 dpr 文
  • EOutOfMemory 使用 Delphi 创建大型 XML

    我正在使用 Delphi 从关系数据库中的数据创建 XML 文档 它在小数据集上测试得很好 但是当我尝试将数据集的大小扩展到生产级别时 它最终在节点创建期间因 EOutOfMemory 异常而崩溃 我正在使用放在表单上的 TXMLDocum
  • TListView 中的中心子项目图像

    Is it possible to fix the drawing of subitem images in a TListView so that they are not cut off on the left hand side as
  • Writeln 能够支持 Unicode 吗?

    考虑这个程序 APPTYPE CONSOLE begin Writeln Z end 使用 Consolas 字体的控制台上的输出是 Z Windows 控制台非常有能力支持 Unicode 如该程序所示 APPTYPE CONSOLE u
  • 创建无边框表单而不丢失 Windows 命令

    我已将表单更改为无边框表单 我只是更改了BorderStyle财产给bsNone 但现在我的应用程序失去了 Windows 锚点和一些命令 例如 WIN 对齐表单客户端 WIN 最小化表格 WIN 表格右对齐 WIN 表格左对齐 我尝试过设
  • Indy 10 和 sslvTLSv1_2

    我发布的网站目前支持 TLS v1 1 和 TLS 1 2 他们很快将只允许 TLS 1 2 版连接 为此我将 Delphi 5 升级到了 Indy 10 目前 我在代码中创建组件 并且一次运行 3 个线程一切都运行良好 HTTp TIdH
  • 如何制作自定义组件属性?

    我需要帮助来制作一个控件属性 当您单击它时 它会弹出一个自定义对话框 例如设置 就像 TPicture 一样 有什么想法或建议吗 如果您的类用作其他组件的属性 并且您想使用对象检查器来调用对话框 那么您必须实现并注册一个自定义属性编辑器 例
  • Delphi TTask - PPL 中匿名函数中的变量捕获如何工作?

    我开始深入研究 Delphi D11 PPL 并编写了这个小例子 procedure TForm2 LaunchTasks const cmax 5 Var ltask ITask i j Integer begin for i 1 to
  • Delphi 中的非字母排序

    我正在尝试按特定顺序对字符串列表进行排序 我尝试用 B C A 来订购 而不是 A B C 我已经按照我需要的顺序声明了一个 const 数组 我尝试过 CustomSorte 但我不明白如何编写该函数 我现在正在尝试使用 for 循环 但
  • 如何取消注册我的应用程序的文件格式?

    在 Windows 10 中的 Delphi 10 4 2 win 32 VCL 应用程序中 我注册了 ICO我的图形应用程序的文件格式使用DSiWin32 DSiRegisterUserFileAssoc https github com
  • Delphi 生成的 Dylib 在 OSX 上的可靠部署

    我想在 OSX 上部署一个 dylib 它是用 Delphi 创建的 这个 dylib 应该是可由第三方应用程序加载 这看起来像是一个重复的问题 但经过大量搜索后 我找不到答案 这和这个是同一个问题 https forums embarca

随机推荐

  • Java中大小写转换

    我想将字符串的第一个字符转换为大写 其余字符转换为小写 我该怎么做 Example String inputval ABCb OR a123BC DET or aBcd String outputval Abcb or A123bc det
  • WPF C#:通过拖放重新排列列表框中的项目

    我试图弄清楚如何通过鼠标拖动来上下移动预先填充的列表框中的项目 我已经查看了 Microsoft api 中的 Control DoDragDrop 方法 但我仍然无法让它执行任何操作 由于我是视觉工作室环境的新手 因此我将不胜感激 我尝试
  • str_replace_all 迭代替换命名向量元素,而不是一次全部替换

    假设我有一个很长的字符串 pneumonoultramicroscopesilicovolcanoconiosis 我想用stringr str replace all用其他字母替换某些字母 根据文档 str replace all可以采用
  • Expressjs 不会破坏会话

    我有一个 Backbone View 它向服务器发送 Ajax 调用以删除会话 在服务器上触发以下事件 app delete session function req res if req session req session destr
  • 使用 awk 或 sed 删除列

    我有一个包含三列的文件 我想删除第三列 就地编辑 我怎样才能用 awk 或 sed 做到这一点 123 abc 22 3 453 abg 56 7 1236 hjg 2 3 所需输出 123 abc 453 abg 1236 hjg 尝试这
  • 正则表达式:我想要这个、那个、那个……以任何顺序

    我什至不确定这是否可能 但这就是我想要的 String NS306 FEBRUARY 20078 9 201013B1 9 1Low31 AUGUST 19870 我有一个文本框 可以在其中输入搜索参数 它们以空格分隔 因此 我想返回一个匹
  • Twitter Bootstrap -
    的两列布局

    在 Bootstrap 2 3 中 是否有一种标准化的方法来为 HTML 提供两列布局
  • Jenkins,SSH 插件,传输 0 个文件

    我们是一个三人小组 使用 MEANJS 做一个项目 Bitbucket 是我们的源代码控制 我们使用 Jenkins 进行测试自动化和 CI 我们希望使用 Jenkins 从 Bitbucket 中拉取 构建并运行测试 然后通过 SSH 将
  • 使用 Java 并行/多线程编写现有代码

    我有一个非常简单的爬虫 我想让我当前的代码在几个线程中运行 您能为我提供一些教程或文章来帮助我完成此测试吗 我最初是一名 Net 开发人员 在 Net 中 我在多线程中运行代码没有任何问题 但不幸的是我对 Java 中的线程一无所知 我的爬
  • TCP 连接保持活动状态

    我正在创建一个客户端服务器应用程序 服务器已经设计并就位等待来自客户端的连接 现在 在客户端部分 我希望在应用程序的整个生命周期中保持连接处于活动状态 并且仅当主客户端应用程序关闭或关闭或服务器关闭它时 连接才会关闭 目前服务器每 10 秒
  • Dask 不支持项目分配

    我们可以通过哪些方式在 Dask 数组中执行项目分配 即使是非常简单的项目分配 例如 a 0 2 不起作用 正确的 这是文档中指出的第一个限制 一般来说 涉及 for 循环和直接分配各个元素的工作流程很难并行化 Dask 阵列没有进行此尝试
  • CNN 与 keras,准确性没有提高

    我最近开始学习机器学习 我正在学习CNN 我计划在这个的帮助下编写一个用于汽车损坏严重程度检测的应用程序喀拉斯博客和这个github 仓库 汽车数据集如下所示 F WORKSPACE ML CAR DAMAGE DETECTOR DATAS
  • 将 tumblr 博客与网站集成

    我想将我的 tumblr feed 集成到我的网站中 tumblr 似乎有一个 API 但我不太清楚如何使用它 据我了解 我请求该页面 tumblr 返回一个包含我博客内容的 xml 文件 但是我怎样才能把这个 xml 变成有意义的 htm
  • Access 2010 中的 WHERE 区分大小写

    我必须将数据从 Paradox 数据库导入到新创建的 WPF SQL Server 应用程序中 我已成功将必要的悖论数据导入到 Access 中 现在正在编写一个实用程序来转换数据并将其导入到 SQL Server 中 现在我遇到的问题是悖
  • 当 IDENTITY_INSERT 设置为 OFF 时,SQL 无法在表“Table”中插入标识列的显式值[重复]

    这个问题在这里已经有答案了 sqlfiddle上的结构表和结果查询 我想使用查询 INSERT INTO Price id price id firm id city name VALUES 12002 1429 73041 25 1200
  • r 中带有重叠圆圈(填充和大小)的行列热图

    这是我正在尝试开发的图表 我有行和列坐标变量 还有三个定量变量 rectheat 填充矩形热图 circlesize 圆圈大小 circlefill 填充颜色热图 NA 应该缺失以不同的颜色 例如灰色 表示 以下为数据 set seed 1
  • Android 架构组件 ViewModel - 如何在测试 Activity 上模拟 ViewModel?

    我正在尝试设置类似于Github浏览器示例看起来示例项目只有模拟ViewModel for Fragment但不是一个例子Activity 这是我试图测试的代码Activity通过嘲笑ViewModel 但是ViewModel之前没有设置好
  • 我怎样才能捕获 404?

    我有以下代码 HttpWebRequest request HttpWebRequest WebRequest Create url request Method HEAD request Credentials MyCredentialC
  • Vuejs:如何将对象作为 prop 传递并让组件更新子对象

    我正在尝试创建一个接受对象作为 prop 的组件 并且可以使用同步或发出事件修改该对象的不同属性并将值返回给父级 该示例不起作用 但它只是为了演示我想要实现的目标 这是我想要实现的目标的一个片段 Vue component child te
  • Delphi 2009,Indy 10,TIdTCPServer.OnExecute,如何抓取InputBuffer中的所有字节

    我正在摆弄 Delphi 2009 提供的 Indy 10 并且在 OnExecute 触发时无法从 IOHandler 获取所有数据 procedure TFormMain IdTCPServerExecute AContext TIdC