DataSnap XE2 和 TStream 方法参数

2023-12-01

我正在 Delphi XE2 中使用 TCP/IP 协议开发 DataSnap 项目,该项目需要将二进制数据流作为方法参数传递到服务器。我遇到的问题是流内容似乎有大约 32 KB 的大小限制。超出此限制,服务器接收到的流为空。如果我传递其他方法参数,它们会完好无损地到达,因此这似乎是参数级别的问题。

以下是 DataSnap 服务类的声明方式:

  TDataSnapTestClient = class(TDSAdminClient)
  private
    FSendDataCommand: TDBXCommand;
  public
    constructor Create(ADBXConnection: TDBXConnection); overload;
    constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload;
    destructor Destroy; override;
    procedure SendData(Data: TStream);
  end;

我使用的方法应该有效,至少根据 Jim Tierney 的文章来看是这样。也就是说,自 Delphi 2009 以来显然发生了一些更改,这些更改破坏了 Jim Tierney 的示例代码。

DataSnap 服务器方法流参数

任何有关如何解决此问题的想法将不胜感激。


DataSnap 以 32k 块的形式传输数据。在所有块重新组装之前,接收端无法知道将接收多少字节。接收到所有数据后,DataSnap 不会设置数据的大小TStream接收数据的流,因此在将其移动到另一个知道流中有多少字节的流之前,您无法使用它。

我知道从 DataSnap 服务器拉取 32k+ 与将 32k+ 推送到 DataSnap 服务器不同,但这也可能适合您。尝试运行TStreamDataSnap服务器完成接收数据后通过此代码:

procedure CopyStreamToMemoryStream(const ASource: TStream; var ADest: TMemoryStream; const Rewind: Boolean = True);
const
  LBufSize = $F000;
var
  LBuffer: PByte;
  LReadCount: Integer;
begin
  GetMem(LBuffer, LBufSize);
  ADest.Clear;
  try
    repeat
      LReadCount := ASource.Read(LBuffer^, LBufSize);
      if LReadCount > 0 then
        ADest.WriteBuffer(LBuffer^, LReadCount);
    until LReadCount < LBufSize;
  finally
    FreeMem(LBuffer, LBufSize);
  end;
  if Rewind then
    ADest.Seek(0, TSeekOrigin.soBeginning);
end;

我不记得在哪里找到这个代码(几年前),所以我无法在应得的信用处给予信用,但它多年来一直为我可靠地工作。

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

DataSnap XE2 和 TStream 方法参数 的相关文章

  • 在 Delphi 中强制非阻塞临时提示窗口

    我一直在寻找 但找不到解决方案 所以我想也许我应该简单地发布它 这是我想要在 Delphi 2009 中做的事情 在我的应用程序中的某个时刻 我想向用户显示一条消息 这应该是正常的提示窗口 在正常应用程序定义的提示暂停后自动消失 并带有自定
  • 获取与请求

    我正在使用 JSON 流并尝试使用 fetch 来使用它 该流每隔几秒发出一些数据 仅当流关闭服务器端时 使用 fetch 来使用流才可以访问数据 例如 var target the url var options method POST
  • 如何在 Java 中读取/转换 InputStream 为字符串?

    如果你有一个java io InputStream对象 您应该如何处理该对象并生成一个String 假设我有一个InputStream包含文本数据 我想将其转换为String 例如我可以将其写入日志文件 最简单的方法是什么InputStre
  • 无法通过Delphi替换Word应用程序中的页脚文本

    我正在尝试替换页脚中的文本 我使用以下代码 通过它我可以替换正常内容 正文 但不能替换页脚 页眉中的内容 myWinWordApp CreateOLEObject Word Application myWinWordApp visible
  • 递归遍历树视图中的节点?

    我有一个树视图 其中已经填充了另一个过程中的文件 文件夹 我想按照从上到下的确切顺序逐项迭代树视图中的项目 但是 与普通列表不同 我不能仅使用简单的for对此的声明 我必须进入每个节点等 我该怎么做呢 我希望有一种方法可以在不运行递归过程的
  • 处理响应后使用 Amazon S3 响应流

    我正在使用 Amazon SDK 并且有一个方法可以为存储在 Amazon S3 服务中的对象返回 Stream 它包含这样的内容 var request new GetObjectRequest WithBucketName bucket
  • 在运行时创建 TQReport 元素

    在运行时创建 TQReport 元素 嗯 至少尝试一下 我不知道这份报告中应出现哪些标题或数据 我得到一个代表数据行和列的 TString 的 TList 我在组的带打印事件中植入 创建 指令 并在主数据行带的 OnNeedData 事件中
  • 错误:使用 Microsoft WebService.dll 通过 Delphi7 规范化 XML

    我正在使用 Delphi7 修改旧项目以添加使用证书和签名 经过一番搜索后我发现XML 规范化函数 https learn microsoft com en us previous versions dd815358 v vs 85 但我无
  • 如何从具有管理员权限的应用程序接收键盘输入到非管理员应用程序?

    我编写了一个应用程序 该应用程序具有覆盖类型的窗口 可以通过热键显示和隐藏该窗口 而另一个应用程序具有焦点 所述另一个应用程序是一个以管理员权限运行的 DirectX 游戏 我已经尝试了 3 种可能的解决方案 以便在其他应用程序中按下我的热
  • VCL.位图到 FMX.位图

    我在网上找到了这段代码 但 FMX Bitmap 没有扫描线 是否可以以某种方式将 VCL TBitmap 复制或绘制到 FMX Bitmap IFDEF MSWINDOWS type TBitmap FMX Types TBitmap T
  • 如何在 OSX 上的应用程序名称下创建子项菜单?

    如何在下面添加TMenuItemProject1以上Quit在下面的屏幕截图上 我创建了一个 TMenuBar 并选中了 UseOSMenu 属性 我添加的第一个 TMenuItem 是主栏中的第二个 TMenuItem 您可以通过将 II
  • 如何组合输出流,以便输出同时到达多个位置?

    我想将两个 或更多 流合成为一个 我的目标是任何输出都指向cout cerr and clog也可以与原始流一起输出到文件中 例如 当事情记录到控制台时 关闭后 我仍然希望能够返回并查看输出 我正在考虑做这样的事情 class stream
  • Firemonkey 编辑/组合自动完成/打字时自动建议

    实施方式是什么Autocomplete or Autosuggest适用于 Windows Android 平台以及 MacOS 和 iOS 的 Delphi Firemonkey Example 当用户在 Google 搜索框中输入文本时
  • 运行delphi客户端自动化程序后excel.exe保持加载状态的原因是什么?

    我编写了一个 Delphi 程序 该程序从单个 XLS 文件的多个不同电子表格中提取数据并将其合并到文本文件中以供以后处理 这是德尔福7console程序 最相关的代码片段的摘录将向您表明 显然 我的程序表现得相当好 或者至少达到了它需要的
  • 将大文件返回为拆分 zip 文件、流或字节数组 WCF 的最佳方法

    我已经将 zip 文件流返回给客户端 如下所示MessageContract MessageContract public class ExportResult C MessageHeader public PackedStudy C Pa
  • 使用 OLE 和 Delphi 提高 Word 文档中搜索替换的性能

    经过一些实验 我最终得到了以下代码来在 MSWord 中执行搜索和替换 此代码在页眉和页脚中也能完美运行 包括首页或奇数 偶数页的页眉和 或页脚不同的情况 问题是我需要打电话MSWordSearchAndReplaceInAllDocume
  • 如何将 REST API 与 FireMonkey 结合使用?

    我需要在 FireMonkey 中实现 REST API 来获取一些信息 但我不确定如何做到这一点 REST API使用OAuth2 我可以访问两个代码 Consumer Key和Consumer Secret 之后 我需要获得一个临时的
  • 如何在Delphi中下载一个非常简单的HTTPS页面?

    我尝试了在这里看到的代码 但它不适用于 HTTPS 我需要将此页面作为字符串下载 并在其上添加一些换行符 以便将信息按顺序放入 TMemo 中 怎么做 我尝试使用 Indy 但由于 SSL 问题而失败 我尝试了此页面的解决方案 如何将网页下
  • 安全重载流运算符>>

    有大量关于超载的信息operator lt lt 模仿一个toString style 方法 将复杂对象转换为字符串 我对 感兴趣also实施逆过程 operator gt gt 将字符串反序列化为对象 通过检查STL来源 我收集到 ist
  • 处理 TShellListView 后代中的文件放置

    我正在尝试创建 TShellListView 的后代 它接受从 Windows 资源管理器中删除的文件 我想在组件定义中处理拖 放操作 而不必在任何使用该组件的应用程序中实现它 我找到了接受从 Windows 资源管理器中拖放的文件的示例

随机推荐