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

ESFramework介紹之(35)―― IMessageTranscei

系統 1670 0

(本文適用于ESFramework V0.3+)

ESFramework介紹之(7)-- 服務器代理IServerAgent 一文中,我們詳細的介紹了IServerAgent,我們已經知道,客戶端與服務器之間的所有通信都可經過IServerAgent,包括要轉發的P2P消息。IServerAgent的主要目的是:
(1)屏蔽客戶端與服務端之間的通信協議(Tcp/Udp),ITcpServerAgent、IUdpServerAgent
(2)可將異步的消息請求/回復轉化為同步的方法調用。

客戶端與服務端的所有交互都可以通過IServerAgent進行,但是如果客戶A與客戶B之間直接進行P2P通信了?那么A和B之間的P2PMessage就不需要經過服務器轉發,即不需要提交給IServerAgent,而是交給IP2PChannel發送;如果客戶A和客戶B之間不能直接通信,那么A和B之間的P2PMessage就需要經過服務器轉發。

為了對上層應用屏蔽P2PMessage是通過服務器轉發器的還是通過IP2PChannel直接發送的,ESFramework引入了IMessageTransceiver,它的智能在于,如果P2PMessage可以通過IP2PChannel直接發送,則將其交給IP2PChannel,否則將其提交給IServerAgent由服務器轉發。這樣應用只需要直接使用IMessageTransceiver提交(發送)消息就可以了,而不用關心下層的消息路由途徑。
IMessageTransceiver接口定義如下:

public interface IMessageTransceiver
{
/// <summary>
/// 如果超時仍然沒有回復,則拋出超時異常
/// 如果dataPriority!=DataPriority.CanBeDiscarded,則checkRespond只能為false
/// </summary>
NetMessageCommitRequest(NetMessagerequestMsg,DataPrioritydataPriority, bool checkRespond);

IP2PChannelManagerP2PChannelManager{
set ;}
IServerAgentServerAgent{
set ;}
IPassiveHelperPassiveHelper{
set ;}
}

IMessageTransceiver及其相關組件關系圖如下:
ESFramework介紹之(35)―― IMessageTransceiver

我們看到,整個應用所有的消息收發都可以通過IMessageTransceiver進行,而不用在去操作IServerAgent了(當然,我們可以完全在IServerAgent的基礎上構建應用,而不關心IMessageTransceiver的存在)。當有消息發送/提交(無論是基本消息、功能請求消息、還是P2P消息)時,直接提交給IMessageTransceiver即可。IMessageTransceiver對要發送的消息采取如下流程:
(1)如果是非P2P消息,則直接提交給IServerAgent。
(2)如果是P2P消息,然后向p2PChannelManager查詢針對目標客戶的P2PChannel是否存在,如果存在,則直接通過P2PChannel發送;否則,就提交給IServerAgent進行轉發。
以下是IMessageTransceiver實現這個流程的代碼:

public NetMessageCommitRequest(NetMessagerequestMsg,DataPrioritydataPriority, bool checkRespond)
{
// 通過IP2PChannel發送P2PMessage
if ( this .passiveHelper.GetPassiveMessageType(requestMsg.Header.ServiceKey) == PassiveMessageType.P2PMessage)
{
IP2PChannelchannel
= this .p2PChannelManager.GetP2PChannel(requestMsg.Header.DestUserID);
if (channel != null )
{
channel.SendMessage(requestMsg);
if (checkRespond)
{
return this .responseManager.PickupResponse(requestMsg.Header.ServiceKey,requestMsg.Header.CorrelationID);
}

return null;
}
}

return this .serverAgent.CommitRequest(requestMsg,dataPriority,checkRespond);
}

IP2PChannelManager組件用于管理當前客戶與每個其它客戶之間的P2P通道,它需要根據服務端發回的其它用戶的地址、狀態等信息來構建、銷毀對應的P2P通道(IP2PChannel)。

public interface IP2PChannelManager
{
IP2PChannelGetP2PChannel(
string destUserID);
}

IP2PChannel,如其名,它是客戶與客戶之間P2P通信的信道的抽象,很顯然,目前最常用的P2P通道是基于UDP的NAT穿透的通道,這是IP2PChannelManager的實現之一。如果可能(比如不同的客戶位于同一局域網內部),我們也可以在客戶之間使用基于Tcp 的P2P通道。IP2PChannel接口定義如下:

public interface IP2PChannel
{
void SendMessage(NetMessagemsg);
}


現在,使用ESFramework,我們可以在三個層次上構建你的客戶端應用:
(1)直接在NetworkStream或Socket上構建,這樣可以完全拋開ESFramework,但是這也需要你自己手動的處理所有麻煩的東西。
(2)在ITcpServerAgent上構建,這樣ESFramework會幫你做好所有消息的收發,請求與回復的匹配,消息的優先級分類、消息的自動發送等等。
(3)在IMessageTransceiver構建,到這里,你甚至不用關心你的P2P消息是通過P2PChannel直接發送的還是通過服務器進行中轉的。底層的通信方式對于你的應用是透明的。

在后面介紹NAPT穿透時,我會給出基于NAPT的IP2PChannel實現和對應的IMessageTransceiver實現。感謝關注!

上一篇: ESFramework介紹之(34)―― ITcpServerAgent和IUdpServerAgent組件關系圖

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




ESFramework介紹之(35)―― IMessageTransceiver


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 色网站综合 | 亚洲成人精品 | 一级寡妇乱色毛片全18 | 亚洲特级aaaaaa毛片 | 亚洲天堂免费视频 | 91精品国产免费久久久久久 | 欧美福利一区二区三区 | 婷婷在线观看网站 | 国产精品久久久久久久久久久搜索 | 成人午夜性a一级毛片美女 91精选 | 中文字幕免费 | 国产午夜福利视频一区二区32页 | 福利在线免费 | 亚洲AV久久久久久久无码 | 欧美日韩国产一区二区三区播放 | 高清一区二区在线观看 | 亚洲1区2区3区4区 | 久热这里只有精品视频6 | 国产婷婷综合 | 国产日韩一区二区三区 | 国产欧美日韩精品a在线观看高清 | 韩国精品一区二区 | 91免费版成人 | 排球少年第四季 | 成人亚洲一区 | 国产精品久久久久久久久久日本 | 在线a人片免费观看国产 | 久操网址 | 日本不卡视频在线播放 | 欧美区在线| 日韩 欧美 国产 师生 制服 | 人人干人人舔 | 久草资源 | 午夜草逼 | 亚洲精品456人成在线 | 新神奇四侠免费完整版在线观看 | 成人免费毛片aaaaaa片 | 欧美激情刺激爽免费视频观看 | 亚洲精品免费观看 | 99热com| 日本一区二区三区视频在线观看 |