黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

ESFramework介紹之(35)―― IMessageTranscei

系統(tǒng) 1946 0

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

ESFramework介紹之(7)-- 服務(wù)器代理IServerAgent 一文中,我們?cè)敿?xì)的介紹了IServerAgent,我們已經(jīng)知道,客戶端與服務(wù)器之間的所有通信都可經(jīng)過(guò)IServerAgent,包括要轉(zhuǎn)發(fā)的P2P消息。IServerAgent的主要目的是:
(1)屏蔽客戶端與服務(wù)端之間的通信協(xié)議(Tcp/Udp),ITcpServerAgent、IUdpServerAgent
(2)可將異步的消息請(qǐng)求/回復(fù)轉(zhuǎn)化為同步的方法調(diào)用。

客戶端與服務(wù)端的所有交互都可以通過(guò)IServerAgent進(jìn)行,但是如果客戶A與客戶B之間直接進(jìn)行P2P通信了?那么A和B之間的P2PMessage就不需要經(jīng)過(guò)服務(wù)器轉(zhuǎn)發(fā),即不需要提交給IServerAgent,而是交給IP2PChannel發(fā)送;如果客戶A和客戶B之間不能直接通信,那么A和B之間的P2PMessage就需要經(jīng)過(guò)服務(wù)器轉(zhuǎn)發(fā)。

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

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

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

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

我們看到,整個(gè)應(yīng)用所有的消息收發(fā)都可以通過(guò)IMessageTransceiver進(jìn)行,而不用在去操作IServerAgent了(當(dāng)然,我們可以完全在IServerAgent的基礎(chǔ)上構(gòu)建應(yīng)用,而不關(guān)心IMessageTransceiver的存在)。當(dāng)有消息發(fā)送/提交(無(wú)論是基本消息、功能請(qǐng)求消息、還是P2P消息)時(shí),直接提交給IMessageTransceiver即可。IMessageTransceiver對(duì)要發(fā)送的消息采取如下流程:
(1)如果是非P2P消息,則直接提交給IServerAgent。
(2)如果是P2P消息,然后向p2PChannelManager查詢針對(duì)目標(biāo)客戶的P2PChannel是否存在,如果存在,則直接通過(guò)P2PChannel發(fā)送;否則,就提交給IServerAgent進(jìn)行轉(zhuǎn)發(fā)。
以下是IMessageTransceiver實(shí)現(xiàn)這個(gè)流程的代碼:

public NetMessageCommitRequest(NetMessagerequestMsg,DataPrioritydataPriority, bool checkRespond)
{
// 通過(guò)IP2PChannel發(fā)送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組件用于管理當(dāng)前客戶與每個(gè)其它客戶之間的P2P通道,它需要根據(jù)服務(wù)端發(fā)回的其它用戶的地址、狀態(tài)等信息來(lái)構(gòu)建、銷毀對(duì)應(yīng)的P2P通道(IP2PChannel)。

public interface IP2PChannelManager
{
IP2PChannelGetP2PChannel(
string destUserID);
}

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

public interface IP2PChannel
{
void SendMessage(NetMessagemsg);
}


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

在后面介紹NAPT穿透時(shí),我會(huì)給出基于NAPT的IP2PChannel實(shí)現(xiàn)和對(duì)應(yīng)的IMessageTransceiver實(shí)現(xiàn)。感謝關(guān)注!

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

轉(zhuǎn)到: ESFramework 可復(fù)用的應(yīng)用框架(序)




ESFramework介紹之(35)―― IMessageTransceiver


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論