2

我正在使用 .Net TcpClient / Sockets 编写一个 HTTP 客户端。

到目前为止,客户端通过遍历 NetworkStream 响应(在向 TcpClient 写入 GET 请求之后)、解析标头并检索相关的消息正文字节/分块字节来处理 Content-Length 和分块响应。为此,它使用 NetworkStream ReadByte 方法。

这一切都很好,但性能是应用程序的一个关键考虑因素,所以我想让它尽可能快速和高效。

最初,这将涉及将 ReadByte 交换为 Read 以获取消息正文(基于 Content-Length)或分块消息正文字节检索到适当大小的缓冲区,在所有其他区域使用 ReadByte(例如读取标头、块大小等)。

我很想知道关于更好/不同方法来实现最佳性能的想法?显然,HTTP 的主要问题是不知道响应流的长度,除非在检索时对其进行解析。

我没有为此使用更多抽象类(例如HttpWebRequest)有一个特定的原因(我需要在套接字级别进行更好的控制)。

非常感谢,

克里斯

4

1 回答 1

1

我建议使用具有中等大小缓冲区的进程。反复填充缓冲区,直到响应流结束。当缓冲区已满或流结束时,将该缓冲区内容附加到字符串(或用于存储消息的任何内容)。

如果您想在流的早期阅读一些重要信息,请阅读足够多的流以看到它。(换句话说,如果您不想,则不需要在第一次通过时填充缓冲区。)

您还应该考虑使用事件系统来表示新数据的存在,新数据的形成方式使得您的流程的主要部分不需要知道数据来自哪里或如何缓冲它.

编辑

在回答您的评论问题时,如果您尝试将一个连接重用于多个请求,您将创建一个线程来一遍又一遍地读取它。当它找到数据时,它会使用该事件将其推出以供程序的主要部分处理。我手边没有样本,但你应该可以通过一些 bing 或 google 搜索找到几个。

于 2009-12-01T18:28:17.193 回答