2011-02-27 133 views
5

我试图用C#在异步套接字编程风格中创建一个简单的网络服务器。目的非常狭窄 - 一个Comet服务器(http long-polling)。Web服务器 - 如何解析请求?异步流标记器?

我已经运行了Windows服务,接受连接,将请求信息转储到控制台并将简单的固定内容返回给客户端。

现在,我找不出一个可管理的策略来异步和安全地解析请求数据。我以前编写过同步LL1解析器。我不确定LL1 Parser对于HTTP是否合适或必需。我不知道如何异步标记输入流。我所能想到的是每个客户端都有一个输入缓冲区,读入该缓冲区,然后将其复制到一个StringBuilder中,并定期检查是否有完整的请求。但这似乎效率低下,可能导致难以调试/维护代码。

此外,有两个阶段的连接接收请求的全部和发送一个响应 - 在这种情况下,在一定的延迟后。一旦请求被验证并且可操作,那么我是否打算将连接注册到长投票管理器中。但是,行为不端的客户端可能会继续发送数据并填充缓冲区,所以我认为我需要在响应阶段继续监视并清空输入流,对吗?

对此的任何指导表示赞赏。

我想第一步是知道是否有可能异步有效标记网络流,并没有一个大的中间缓冲区。即使没有合适的解析器,创建标记器的挑战也适用于一次读取输入“行”,甚至读取直到双空行(一个大标记)。我不想一次从网络读取一个字节,但我也不想读取太多的字节,并且不得不将它们存储在某个中间缓冲区中,对吗?

回答

2

对于HTTP最好的办法是读头完全在内存中(直到收到\r\n\r\n),然后简单地通过\r\n分裂由:获得头,每头分离名称和值。

没有必要为此使用复杂的解析器。

+1

谢谢。当跨越缓冲区读取时,检查顺序是否有弹性的好方法是什么?当它的请求*太长*我是否需要在该点之后继续清空输入流,还是可以安全地忽略其他输入而不必担心缓冲区填满并影响其他连接? – 2011-02-27 22:36:17