我正在使用.Net TcpClient / Sockets编写HTTP客户端。
到目前为止,客户端通过迭代NetworkStream响应(在向TcpClient写入GET请求之后)处理Content-Length和chunked响应,解析头并检索相关的消息体字节/ chunked字节。为此,它使用NetworkStream ReadByte方法。
这一切都很好,但性能是应用程序的关键考虑因素,所以我希望尽可能快速有效。
最初这将涉及将ReadByte for Read换成消息体(基于Content-Length)或chunked消息体字节检索到适当大小的缓冲区,在所有其他区域使用ReadByte(例如读取Headers,Chunk size等) )。
我有兴趣了解更好/不同的方法来实现最佳性能吗?显然,HTTP的主要问题是不知道响应流的长度,除非在检索它时对其进行解析。
我没有使用更多抽象类(例如HttpWebRequest)的特定原因(我需要在套接字级别更好地控制)。
非常感谢,
克里斯
答案 0 :(得分:1)
我建议使用中等大小的缓冲液。重复填充缓冲区,直到响应流结束。当缓冲区已满或流结束时,将该缓冲区内容附加到字符串上(或者您用于存储消息的任何内容)。
如果您想在流的早期读取一些重要信息,请仔细阅读该流以查看该信息。 (换句话说,如果你不想,你不需要在第一遍填充缓冲区。)
您还应该考虑使用事件系统来表示新数据的存在,这些新数据的形成方式使得您的流程的主要部分不需要知道数据来自何处或您是如何知道的正在缓冲它。
修改强>
在回答您的评论问题时,如果您尝试为多个请求重用一个连接,则可以创建一个一遍又一遍地从中读取的线程。当它找到数据时,它会使用该事件将其推出以供程序的主要部分处理。我没有方便的示例,但您应该可以通过一些bing或谷歌搜索找到几个。