我正在使用VB6 Winsock控件。当我对服务器进行POST时,我会将响应作为多个数据到达事件返回。
您如何知道所有数据何时到达?
(我猜这是Winsock_Close事件发生的时候)
答案 0 :(得分:1)
我过去使用过VB6 Winsock控件,我所做的是以某种方式格式化我的消息,以便知道所有数据何时到达。
示例:每封邮件以“[”开头,以“]”结尾。
“[留言文字]”
当数据从DataArrival事件进入时检查消息“]”的结尾。如果它在那里你至少收到了一条完整的信息,可能还有一条新信息的开头。如果有更多消息在等待,请将消息数据存储在表单级变量中,并在下次触发DataArrival事件时附加到该变量。
答案 1 :(得分:1)
在HTTP中,您必须解析并分析服务器发回给您的回复数据,以便了解如何全部阅读。
首先,服务器发回一个CRLF分隔的标题行列表,这些标题行由空白的CRLF分隔的行自行终止。然后,您必须查看“Content-Length”和“Transfer-Encoding”标头的实际值,以了解如何读取剩余数据。
如果没有'Transfer-Encoding'标头,或者它没有包含'chunked'项,那么'Content-Length'标头指定要读取的剩余字节数。但是如果'Transfer-Encoding'标题包含'chunked'项,那么你必须一次一个地读取和解析剩余数据,以便知道数据何时结束(每个块报告自己的大小,并且最后一个块报告大小为0)。
不,除非“连接”标题明确表示“关闭”,否则在发送回复后您不能依赖关闭连接。对于HTTP 1.1,该标头通常设置为'keep-alive',这意味着套接字保持打开状态,以便客户端可以在同一个套接字上发送更多请求。
阅读RFC 2616了解详情。
答案 2 :(得分:0)
不,当所有数据都已到达时,Close事件不会触发,当您关闭连接时它会触发。知道何时传输了所有数据并不是Winsock控件的工作,这是你的。作为客户端/服务器通信协议实现的一部分,您必须告诉客户端期望的内容。
假设您的客户端需要来自服务器的文件内容。客户端不知道文件中有多少数据。交流可能会是这样的:
理想情况下,服务器也会对数据附加校验和,您必须实现某种超时机制,如果没有获得预期的数据量,请弄清楚要做什么,等等。 / p>