gpt4 book ai didi

delphi - 使用 Indy 的 HTTP 连续分组流

转载 作者:行者123 更新时间:2023-12-03 14:59:32 25 4
gpt4 key购买 nike

我有一个 JSON-RPC 服务,它为其中一个请求返回连续的 JSON 对象流。

即:

{id:'1'}
{id:'2'}
//30 minutes of no data
{id:'3'}
//...

当然,没有 Content-Length,因为流是无限的。

我正在使用自定义 TStream 后代来接收和解析数据。但在内部,TIdHttp 会缓冲数据,并且在收到 RecvBufferSize 字节之前不会将其传递给我。

这会导致:

{id:'1'} //received
{id:'2'} //buffered by Indy but not received
//30 minutes of no data
{id:'3'} //this is where Indy commits {id:'2'} to me

显然这是行不通的,因为 30 分钟前重要的消息应该在 30 分钟前发送。

我希望 Indy 做套接字所做的事情:读取 RecvBufferSize 或更少(如果有可用数据)并立即返回。

我找到了this discussion从 2005 年开始,一些可怜的人试图向 Indy 开发者解释这个问题,但他们不理解他。 (阅读它;这是一个悲伤的景象)

无论如何,他通过编写自定义 IOHandler 后代来解决这个问题,但那是在 2005 年,也许今天有一些现成的解决方案?

最佳答案

在我看来,这像是一个WebSocket任务,因为您的连接不再是面向普通 HTTP 问题/答案的,而是内容流。

参见WebSocket server implementations for Delphi一些代码。

at least one based on Indy ,来自 AsmProfiler 的作者。

据我所知,websocket 中有两种流:二进制和文本。从 websocket 的角度来看,我怀疑您的 JSON 流是一些文本内容。

另一个选择是使用 long-pooling或一些较旧的协议(protocol),这些协议(protocol)对 root 用户更友好 - 当连接切换到 websockets 模式时,它不再是标准的 HTTP,因此一些“明智的”数据包检查工具(在公司网络上)可能会将其识别为安全攻击(例如 DoS),因此可能会停止连接。

关于delphi - 使用 Indy 的 HTTP 连续分组流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15615347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com