delphi – 使用Indy的HTTP连续打包流
我有一个
JSON-RPC服务,其中一个请求返回一个连续的JSON对象流.
即: {id:'1'} {id:'2'} //30 minutes of no data {id:'3'} //... 当然,没有内容长度,因为流是无穷无尽的. 我正在使用自定义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并立即返回. 我从2005年发现this discussion,其中一些可怜的灵魂试图向Indy开发者解释这个问题,但他们并不了解他. (阅读它;这是一个悲伤的景象) 无论如何,他通过编写自定义IOHandler后代来解决这个问题,但那是在2005年,也许今天有一些现成的解决方案? 解决方法
听起来像WebSocket任务,因为您的连接不再是简单的HTTP问题/答案,而是一个内容流.
有些代码请参见WebSocket server implementations for Delphi. 来自AsmProfiler的作者有at least one based on Indy. AFAIK在websockets中有两种流:二进制和文本.我怀疑你的JSON流是一些文本内容,从websocket的角度来看. 另一种选择是使用long-pooling或一些较旧的协议,这些协议更易于管理 – 当连接切换到websockets模式时,它不再是标准的HTTP,因此一些“明智的”数据包检查工具(在公司网络上)可能将其识别为安全攻击(例如DoS),因此可以停止连接. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |