HL AsySocket 服務開發框架 - 整體思路與架構

一 背景c#

        最近在園子了瀏覽了幾篇有關Socket文章,獲得了一些啓發萌生了想要重構公司在2000年用.NET Framework 2.0 與 Visual Studio 2005開發的AsySocket項目爲了但願可以儘快的瞭解公司這個項目,Google了不少國內外的網站讓我對Socket有了更深層次的瞭解也知道Socket從2.0到4.0發生許多變化,好比在2.0中沒有SocketAsyncEventArgs類,你們在園子裏把這個類說的這麼邪乎,小弟不才有想嘗試着使用.NET Framework 4.0 與 Visual Studio 2010也開發一個可擴展多線程異步Socket服務器框架。 爲了區分現把AsySocket改名爲HL AsySocket Server 也就是框架的名字。緩存

二 Socket概述服務器

      在園子裏看到不少大師都寫的很不錯,可是好像也沒有幾我的真正把這一系列寫完,但願本身可以堅持到最後把這一系列寫完。也請各位看管監督檢查。 廢話不說了咱們先說說Socket服務器主要關注那些問題,她的出現主要用於提供高效、穩定的數據處理、消息轉發等服務,她直接決定了前臺應用程序的性能。咱們先從總體上認識一下Socket服務器 如圖:網絡

image

他們之間的關係與流程圖 以下:多線程

image

上面咱們說了Socket服務器主要關心那些問題,咱們在來看看Socket應用場景:架構

image

  Socket中的 Socket的Send方法,並不是你們想象中的從一個端口發送消息到另外一個端口,它僅僅是拷貝數據到基礎系統的發送緩衝區,而後由基礎系統將發送緩衝區的數據到鏈接的另外一端口。值得一說的是,這裏的拷貝數據與異步發送消息的拷貝是不同的,同步發送的拷貝,是直接拷貝數據到基礎系統緩衝區,拷貝完成後返回,在拷貝的過程當中,執行線程會IO等待, 此種拷貝與Socket自帶的Buffer空間無關,但異步發送消息的拷貝,是將Socket自帶的Buffer空間內的全部數據,拷貝到基礎系統發送緩衝區,並當即返回,執行線程無需IO等待,因此異步發送在發送前必須執行SetBuffer方法,拷貝完成後,會觸發你自定義回調函數ProcessSend,在ProcessSend方法中,調用SetBuffer方法,從新初始化Buffer空間。以下圖:框架

image

 

根據上圖:異步

     咱們須要監控Socket服務器的最大鏈接數,當前鏈接數,緩衝區,發送緩存區,接收緩存區 如圖:分佈式

image

三 HL AsySocket Server 總體規劃函數

 此次居然是一次專題學習那就的有一份規劃圖與願景圖了,知識管理我打算模仿GTD來作,以下

總共分爲三大部分:

第一部分也是最重要一部分就是收集與Socket全部相關的文章,示例和開源框架。

第二部分整理收集到的材料,這要取決與第一部分和我本身的數據整理能力,理解能力和寫做能力了。

第三部分是分享一些認爲本身已經整理出一套特定的解決方案了。

咱們先來看看Socket應用環境 以下圖:

image

Socket服務器的主要核心線程處理流程:

image

   客服端鏈接監聽線程

        循環偵聽遠程客戶端的Socket鏈接請求。若是存在,經過適當規範性判斷後建立該Socket的客戶端會話對象,同時調用該會話對象的Socket異步數據接收方法,接收到的數據包存放在會話對象的包隊列中。

   數據包處理線程

         循環檢測會話對象隊列,調用該對象的相關方法完成數據包解析將解包後的消息包拋至業務邏輯層,業務邏輯層收到消息包後,解析消息類型,而後轉入相應的處理流程處理。

   會話表檢測線程

       會話層主要用於記錄在線用戶信息,該層隸屬於業務邏輯層。既然隸屬於業務邏輯層,那爲何還要獨立出來呢?這主要爲之後分佈式開發拓展用,試想,一臺服務器最大能支持多少人同時在線?中國有多少人?若是1億人同時在線,你一臺服務器能支持得了嗎?答案確定是否認的,因此要分佈式開發。分佈式開發涉及到用戶信息同步的問題,因此會話層就要獨立出來了。

Socket異步處理模式

     Socket異步處理模式有兩種,第一種是IAsyncResult模式,如今公司用的就是次模式,第二種是SocketAsyncEventArgs模式,此次我打算用SocketAsyncEventArgs來開發。

Socket Server 「池」模式

1)Buffer池,用於集中管控Socket緩衝區,防止內存碎片。

2)SAEA池,用於集中管控Socket,重複利用Socket(主要處理髮送數據包和接收數據包,並轉發給業務邏輯層)。

3)SQL池,用於分離網絡服務層與數據訪問層(SQL的執行效率遠遠低於網絡層執行效率)。

4)線程池,用於從線程池中調用空閒線程執行業務邏輯,進一步提升網絡層運行效率。

四 參考文章

      其實整篇文章都是參考園子裏的幾個高手而來的,以上的一些圖片在園子是能夠找到,爲何還要本身在畫一邊主要是想加深理解和學習用的,如下是我在園子裏找到幾篇認爲對Socket服務器思想比較好的文章:

相關文章
相關標籤/搜索