2011-02-27 122 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