欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

ESFramework介紹之(4)――消息攔截器INetMess

系統 1763 0
網絡上傳輸的消息經常是經過加密和壓縮,有的特定類型的消息可能還需要進行其它變形, ESFramework 通過 INetMessageHook 對這些功能提供支持。需要說明的是, ESFramework 對消息進行截獲( Hook )處理有兩種方式,一是僅僅 Hook 處理消息主體( Body ),而不對消息頭作任何變換;另一種方式是對整個消息(包括消息頭和主體)都進行 Hook 處理。通常,第一種方式已經能夠滿足我們的大多數應用,并且效率也更高,如果應用有更特殊的要求,可以采用第二種方式。本文先介紹第一種方式,后面的文章中會對第二種給予講解。

INetMessageHook 定義如下:
ESFramework介紹之(4)――消息攔截器INetMessageHook

1 public interface INetMessageHook
2 {
3 // 轉換消息
4 NetMessageCaptureRecievedMsg(NetMessagemsg); // 在交給處理器之前
5 NetMessageCaptureBeforeSendMsg(NetMessagemsg); // 在發送出去之前
6
7 bool Enabled{ get ; set ;} // 是否啟用本Hook
8 }

通過 INetMessageHook 接口可以看到,當消息進入系統時回被 CaptureRecievedMsg 方法截獲(比如,進行解密處理),當把消息發送到網絡之前,將被 CaptureBeforeSendMsg 方法截獲(比如,進行加密處理)。

如果有多個 INetMessageHook ,則可以形成一個 HookList ,消息經過 HookList 時,分別按順序被每個 INetMessageHook 處理, ESFramework 中的 HookList 的參考實現是 EsbNetMessageHook ,并且它也實現了 INetMessageHook 接口,這樣就可以把一個 Hook 鏈當作一個 Hook 了。
ESFramework介紹之(4)――消息攔截器INetMessageHook
其源碼如下:

EsbNetMessageHook
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 public class EsbNetMessageHook:INetMessageHook
2 {
3 #region property
4 private IListhookList = new ArrayList();
5 public IListHookList
6 {
7 set
8 {
9 this .hookList = value;
10 }
11 }
12
13 #region Enabled
14 private bool enabled = true ;
15 public bool Enabled
16 {
17 get
18 {
19 return this .enabled;
20 }
21 set
22 {
23 this .enabled = value;
24 }
25 }
26 #endregion
27
28 #endregion
29
30 #region INetMessageHook成員
31 public NetMessageCaptureRecievedMsg(NetMessagemsg)
32 {
33 if ( ! this .enabled)
34 {
35 return msg;
36 }
37
38 if (msg == null )
39 {
40 return null ;
41 }
42
43 NetMessageresult = msg;
44 for ( int i = 0 ;i < this .hookList.Count;i ++ )
45 {
46 INetMessageHookhook = (INetMessageHook) this .hookList[i];
47 result = hook.CaptureRecievedMsg(result);
48 }
49
50 return result;
51 }
52
53 public NetMessageCaptureBeforeSendMsg(NetMessagemsg)
54 {
55 if ( ! this .enabled)
56 {
57 return msg;
58 }
59
60 if (msg == null )
61 {
62 return null ;
63 }
64
65 NetMessageresult = msg;
66 for ( int i = this .hookList.Count - 1 ;i >= 0 ;i -- )
67 {
68 INetMessageHookhook = (INetMessageHook) this .hookList[i];
69 result = hook.CaptureBeforeSendMsg(result);
70 }
71
72 return result;
73 }
74
75 #endregion
76 }

需要特別注意的是, HookList 的實現中,逐個調用 Hook CaptureRecievedMsg 方法的順序必須與逐個調用 CaptureBeforeSendMsg 方法的順序相反,這就是為什么 EsbNetMessageHook 實現 CaptureBeforeSendMsg 方法時,出現下列代碼的原因:

for ( int i = this .hookList.Count - 1 ;i >= 0 ;i -- )

為了說明為什么需要顛倒 Hook 鏈的情況,可以舉個例子,假設有一個“原始消息”從系統 1 發送到系統 2 ,其間經過了兩個 Hook ,一個加密 Hook ,一個是壓縮 Hook ,則可表示如下:
系統 1 =》原始消息=》加密=》壓縮=》發送
系統 2 =》接收消息=》解壓縮=》解密=》原始消息

還要提醒的是,在具體的 Hook 實現中,截獲處理經常改變 Body 的大小,如果 Body 的大小真的發生了變化,一定要更新消息頭( IMessageHeader )中的 MessageBodyLength 字段。

通常,采用Hook時,服務端與客戶端是對稱的,所以你可以把所有的Hook實現放在一個Dll中,這樣服務端和客戶端可以共同使用這個Hook Dll了。

由于對網絡消息進行壓縮是常見的需求,所以我把
BaseZipHook 納入到了 ESFramework 中,并且,這也是 IMessageHeader 存在 ZipMe 屬性的原因。 ZipMe 屬性用于通知 BaseZipHook 是否對接收到的本條消息進行解壓縮,是否在發送本消息之前進行壓縮。
ESFramework介紹之(4)――消息攔截器INetMessageHook
BaseZipHook
實現如下:

BaseZipHook
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--> 1 public abstract class BaseZipHook:INetMessageHook
2 {
3 public BaseZipHook()
4 {
5 }
6
7 protected abstract byte []Zip( byte []data, int offset, int size);
8 protected abstract byte []Unzip( byte []data, int offset, int size);
9 protected abstract bool IsP2PMessage(NetMessagemsg);
10
11 #region INetMessageHook成員
12
13 #region CaptureRecievedMsg
14 public NetMessageCaptureRecievedMsg(NetMessagemsg)
15 {
16 if ( ! this .enabled)
17 {
18 return msg;
19 }
20
21 if ( ! msg.Header.ZipMe)
22 {
23 return msg;
24 }
25
26 if ( this .IsP2PMessage(msg))
27 {
28 if ( ! this .zipP2pMessage)
29 {
30 return msg;
31 }
32 }
33
34 if (msg.Body == null )
35 {
36 return msg;
37 }
38
39 msg.Body = this .Unzip(msg.Body, 0 ,msg.Header.MessageBodyLength);
40 msg.Header.MessageBodyLength = msg.Body.Length;
41
42 return msg;
43 }
44 #endregion
45
46 #region CaptureBeforeSendMsg
47 public NetMessageCaptureBeforeSendMsg(NetMessagemsg)
48 {
49 if ( ! this .enabled)
50 {
51 return msg;
52 }
53
54 if ( ! msg.Header.ZipMe)
55 {
56 return msg;
57 }
58
59 if ( this .IsP2PMessage(msg))
60 {
61 if ( ! this .zipP2pMessage)
62 {
63 return msg;
64 }
65 }
66
67 if (msg.Body == null )
68 {
69 return msg;
70 }
71
72 msg.Body = this .Zip(msg.Body, 0 ,msg.Header.MessageBodyLength);
73 msg.Header.MessageBodyLength = msg.Body.Length;
74
75 return msg;
76 }
77 #endregion
78
79 #region Enabled
80 private bool enabled = true ;
81 public bool Enabled
82 {
83 get
84 {
85 return this .enabled;
86 }
87 set
88 {
89 this .enabled = value;
90 }
91 }
92 #endregion
93
94 #region ZipP2pMessage通常服務端設置為false,而客戶端設置為true
95 private bool zipP2pMessage = true ;
96 public bool ZipP2pMessage
97 {
98 get
99 {
100 return this .zipP2pMessage;
101 }
102 set
103 {
104 this .zipP2pMessage = value;
105 }
106 }
107 #endregion
108
109 #endregion
110 }

BaseZipHook 是一個抽象類,具體實現的壓縮算法由派生類通過覆寫 Zip Unzip 方法提供。如果要實現一個具體的 ZipHook ,你可以從 BaseZipHook 繼承,并采用 ZipHelper 提供的壓縮 / 解壓縮功能。

到現在為止,我們已經討論了關于消息的比較多的內容了,但還有一個非常重要的組件沒有講到,那就是消息分派器 ITcpStreamDispatcher ,消息分派器直接與 Tcp 組件或 Udp 組件聯系,并且所有消息的進出都要經過 ITcpStreamDispatcher ,所以分派器是一個對消息進行 Hook 的理想位置,并且消息分派器會把具體的消息分派到對應的消息處理器上。欲知道 ITcpStreamDispatcher 的原理與實現,請繼續關注下文:

ESFramework 介紹之( 5 ―― 消息分派器 ITcpStreamDispatcher


上一篇: ESFramework介紹之(3)――消息處理器和處理器工廠

轉到: ESFramework 可復用的通信框架(序)



ESFramework介紹之(4)――消息攔截器INetMessageHook


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!??!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美最猛性xxxxx亚洲精品 | 午夜一级毛片 | 国产综合亚洲精品一区二 | 一区二区三区中文字幕 | 最新亚洲国产有精品 | a久久久久一级毛片护士免费 | 日本精品二区 | 亚洲欧美小视频 | 欧美一区二区三区精品 | 亚洲免费一级视频 | 亚洲午夜精品一区二区蜜桃 | 日韩特级毛片 | 亚洲毛片无码专区亚洲A片 日本高清www午色夜黄 | 日韩欧美精品 | va在线| 国产精品怕怕怕视频免费 | 亚洲综合色婷婷久久 | 欧美a∨一区二区三区久久黄 | 天天做夜夜操 | 欧美日韩中文国产一区发布 | 亚洲无毛视频 | 五月婷婷丁香在线观看 | 国产人成精品综合欧美成人 | 欧洲成人午夜免费大片 | 香蕉福利久久福利久久香蕉 | 精品一区二区三区网站 | 欧美成人免费午夜影视 | 看个毛片 | 精品日韩在线观看 | 网站国产 | 色播欧美 | 美女超碰| 成人黄色免费 | 日韩在线视频免费观看 | 天天狠天天干 | 天天爱夜夜操 | 欧美久久久 | 国产探花在线精品一区二区 | 夜夜操天天射 | 91久色视频 | a毛片成人免费全部播放 |