【问题标题】:Raw HTTP Parsing With an Asynchronous Socket Client使用异步套接字客户端进行原始 HTTP 解析
【发布时间】:2011-05-03 19:39:26
【问题描述】:

我发现another question 要求提供相同类型的功能,但这个问题已有 2 年多的历史了,所以我想知道从那时起是否有人看到过任何东西。

我基本上已经使用标准的 .NET 套接字编写了自己的 asynchronous http/socket client。我维护了一个 1024 个套接字池,并且我有 128 个“服务”线程使用套接字池以每秒高达 371 页的速度从 Internet 下载网页(今天刚刚在单个 Amazon 的 EC2 服务器上进行了测试)。我还制作了另一个异步 HTTP 客户端,它使用 HttpWebRequest 异步下载网页,但速度明显较慢:我的吞吐量平均约为每秒 50 页(也在亚马逊的 EC2 上测试),使用相同的设置:1024 池化 HttpWebRequest s 和 128 个“服务”线程。

当然,提供 HTTP 协议支持会占用更多的处理能力和内存。我希望使用 Amazon 的超大型 EC2 服务器,我不会受到处理能力/内存的限制,而只会受到网络带宽的限制(到目前为止就是这种情况)。

我使用的机器示例是 Amazon 的 High-CPU Extra Large Instance:

  • 7 GB 内存
  • 20 个 EC2 计算单元(8 个虚拟内核,每个内核有 2.5 个 EC2 计算单元)
  • 1690 GB 实例存储
  • 64位平台
  • I/O 性能:高
  • API 名称:c1.xlarge

我可以编写自己的符合 HTTP 协议的 HTTP 处理程序,但如果有一个快速且强大的现成解决方案,它将为我节省大量的工作、痛苦和痛苦。

我至少需要以下功能:

  • 构建 HTTP HEAD/GET(可能还有 POST)请求
  • 从二进制流解析 HTTP 响应
  • 支持 cookie
  • LGP 许可证 (LGPL)

有人知道这样的解决方案吗?

【问题讨论】:

  • 你试过WebClient的性能吗?
  • @jgauffin,我还没有尝试过WebClient yet。看起来这可能是一个可行的答案 - 请确保您发布它,以便我在测试后接受它。
  • 我写了我的评论,因为我不知道它是否更高效。但是我根据您的意愿写了它作为答案。 ;)

标签: c# http .net-3.5 http-headers


【解决方案1】:

我不知道HttpWebRequest 如何在内部使用套接字。打开/关闭套接字可能会对性能造成很大影响。 WebClient 使用 keep-alive,可能会更好。

编辑:我做了一些谷歌搜索,我不会接受这个作为答案。 WebClient 似乎是 HttpWebRequest/Response 的包装器:http://www.codeproject.com/Articles/156610/WP7-WebClient-vs-HttpWebRequest.aspx?msg=3775084

更新

既然您是从套接字开始的,我会坚持使用它们。随意从我的网络服务器项目中获取东西:http://webserver.codeplex.com

我的解析器:

http://webserver.codeplex.com/SourceControl/changeset/view/56552#671689

【讨论】:

  • WebClient 是否允许客户端连接到多个不同的端点?我有数千个端点,到目前为止异步套接字与它们配合得很好(即使在关闭连接之后)......我仍然不知道如何重用套接字:stackoverflow.com/questions/5762276/…
  • 我会坚持使用套接字并使用解析器。随意从我的网络服务器项目中的解析器中借用想法:webserver.codeplex.com。不过,我不会生成标题对象,这样做的性能不是很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多