c# - .Net C# TcpClient/Socket HTTP 客户端性能/效率

标签 c# .net http sockets tcpclient

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

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

一切正常,但性能是应用程序的关键考虑因素,因此我希望尽可能快速高效。

最初这将涉及将 ReadByte 换成读取消息体(基于内容长度)或分块消息体字节检索到适当大小的缓冲区,在所有其他区域使用 ReadByte(例如读取 header 、 block 大小等) ).

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

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

非常感谢,

克里斯

最佳答案

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

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

您还应该考虑使用事件系统来指示新数据的存在,这些数据的形成方式使得您的流程的主要部分不需要知道任何关于数据来自何处或您如何处理的信息正在缓冲它。

编辑

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

关于c# - .Net C# TcpClient/Socket HTTP 客户端性能/效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1827921/

相关文章:

c# - 我是否需要在 WCF DataContract 中公开一个构造函数,以便它在客户端的对象实例化期间工作?

java - 在 HTTP POST 中设置参数

c# - dotnet 构建应用程序部署

c# - SlowCheetah 没有为 EntityFramework 迁移进行转换

c# - .NET - 什么是 "double pointer list"?

.net - ASP.NET 2.0 网站可以引用 WCF Web 服务吗?

apache - HTTP/2 长超时在 HTTP_TRANSACTION_READ_HEADERS

c# - 通过 HTTP 发送文件?

c# - 在 ASP.NET Web 应用程序上使用 WCF 服务应用程序登录

c# - Silverlight 和对 WCF 的同步调用