本文配套源碼
看了上篇隨筆的回復 發現大家都很關心如何實現連接。
但是本節可能不會涉及到數據連接的 具體實現。
盲目的實現連接 而不試圖從更高的位置來考慮連接的作用,只能徒增耦合。
而網絡傳輸的實現各有特點,耦合過高的話 ,稍不注意業務邏輯就會成為通訊協議的犧牲品。
這種狀況 往往讓我們產生"只能針對xxx傳輸協議"的架構 。
其實只要多加思考,我 們便能跳出協議的樊籬,畢竟"遵循某個接口實現一個基於xx通訊協議的類" 屬於那種可以幾 百塊錢外包到"老少邊窮地區地方大學貧困學生"的項目,耗費精力不一定值得。好吧,其實 當年我就是這樣一個很耗精力大學生,所以我們更要給年輕後輩鍛煉的機會不是麼!
先說封包
封包是什麼?
就是一坨數據。
可能是個問題,可能是個答案,可能是個"我 還活著"的聲明,可能是團亂碼
其實沒什麼可說的, 大體上就是數據和標識
有的有 利於工作時候查詢數據,處理數據
有的有利於傳輸。
連接的功能
大家來跟我一起自我催眠
閉上眼睛
想象我們的網絡游戲大廳是一個地方政府辦公室,你 的地盤你做主,你就是黨委書記。
想象我們的客戶端是一個個街道辦事處。
互聯網 就是 郵政電信系統
我們的數據 就是一封一封的信件文檔。
那麼我們的連接應該是什麼呢?
最早的實現傳達室(UDP)
後來有了電話和傳真機 (http)
數據專線 (tcp持續 連接)
這些都是各種協議細節。
你要和一個街道辦事處互通一下信息,
你需要自 己去傳達室麼?
你需要親自操作傳真麼?
你需要操作電腦,打開軟件,登陸帳號, 發送 信息麼?
你需要了解這個街道辦事處電話有沒有欠費 是否有專線 郵遞員有沒有玩忽職守 以便 決定你怎樣傳遞信息麼?
NO , NO ,你已經不是那個層次的人了,你是黨的好干部,你只需要詢 問你的漂亮女秘書!
女秘書,懂麼,很高科技哦!
來來美女 發個郵件出去 順便把包裹 去回來,恩再幫我安排明天下午和張太太喝下午茶。
有新技術了?msn? qq? Windows live meeting? 送女秘書去培訓! 弄兩個秘書輪流培訓!
反正你就兩個要求,收信,發信!
ICodec 就是終端設備,其中包括傳達室大爺、傳真機、電話、msn 、qq 、數據專線 、微縮膠片 等等等等,把 我們的文件變成可以傳輸的格式,從workingpack變成LinkPack.
眼熟麼?這就是橋接模式 把部 分功能的可替換實現做成另一個類,通過別的工廠根據配置文件產生後放入主類哦。
話說回來, 難道各個街道主任也要勢必躬親麼? No, 沒有女秘難道沒有街道大媽?
所以蜜和大媽的主要作 的事情還是一樣的,細節有所不同
Server端的小秘書是 要連接Client端的 叫做 IClientLink
Client端的大媽是要連接 Server端的 叫做 IServerLink
更高級的需求,我們的小秘書和街道大媽 其實都是琛哥派來的臥底,她們就是查理 的天使,安插在街道辦事處裡的天使。
琛哥最近要有組織的擺地攤犯罪,為了防止城管打砸搶, 給她們一人一個加密機要小秘書給大媽隱蔽的通風報信,只有用同規格的加密機才能解開對方的密文哦 ,女特務們加油。。。。
好吧 剩下的事情 就 都是郵電系統該做的了。
參考代碼:
IPack
Code
'---------- -------------------
' Wayne Wang
' 個人研究
' 不是什麼了不起的東西
' 有錯誤的話還請告訴我
' 努力奮斗
' Yeah!
'-----------------------------
Namespace CommonNamespace Common
Public Interface IPackInterface IPack
Enum PackFlagEnum PackFlag
cmdHeart_Up = &H0
cmdLogin_Up = &H1000000
cmdLogin_Down = &H1010001
cmdLogin_Err = &H1010000
cmdLogin_Sign_Up = &H1000100
cmdMove_Up = &H2000000
cmdMove_IntAny_Up = &H2000001
cmdMove_Invite_User_Up = &H2000002
cmdMove_Local_Down = &H2010001
cmdMove_Local_Err = &H2010000
cmdMove_Remote_Down = &H2010101
cmdMove_Remote_Err = &H2010100
cmdLook_Area_Up = &H3000000
cmdLook_ItemPrice_Up = &H3000100
cmdLook_ItemInstr_Up = &H3000200
cmdLook_AccountMoney_Up = &H3000300
cmdLook_Sms_Report_Up = &H3000400
cmdLook_Area_Down = &H3010001
cmdLook_Area_Err = &H3010000
cmdLook_ItemPrice_Down = &H3010101
cmdLook_ItemInstr_Down = &H3010201
cmdLook_AccountMoney_Down = &H3010301
cmdLook_Sms_Report_Down = &H3010401
cmdLook_AreaChildren_Up = &H3000500
cmdLook_AreaChildren_Down = &H3010501
cmdLook_AreaChildren_Err = &H3010500
cmdLook_AreaUser_Up = &H3000600
cmdLook_AreaUser_Down = &H3010601
cmdLook_AreaUser_Err = &H3010600
cmdLook_Guilds_Up = &H3000700
cmdLook_Guilds_Down = &H3010701
cmdLook_Guilds_Err = &H3010700
cmdShop_Buy_Up = &H4000000
cmdShop_Buy_Down = &H4010001
cmdShop_Buy_Err = &H4010000
cmdCheckin_CreateRoom_Up = &H5000100
cmdCheckin_CreateRoom_Down = &H5010101
cmdCheckin_CreateRoom_Err = &H5010100
cmdCheckin_KickAss_Up = &H5000200
cmdCheckin_KickAss_Down = &H5010201
cmdCheckin_KickAss_Err = &H5010200
cmdCheckin_ChangePassword_Up = &H5000300
cmdCheckin_ChangePassword_Down = &H5010301
cmdCheckin_ChangePassword_Err = &H5010300
cmdGameLogic = &H6000000
cmdGameLogic_SoloGame_Up = &H6000001
cmdGameLogic_SoloGame_Down = &H6010001
cmdChatPush_Chat_Up = &H7000100
cmdChatPush_Chat_Down = &H7010100
cmdChatPush_Whisper_Up = &H7000101
cmdChatPush_Whisper_Down = &H7010101
cmdChatPush_Emote_Up = &H7000200
cmdChatPush_Emote_Down = &H7010200
cmdChatPush_PEmote_Up = &H7000201
cmdChatPush_PEmote_Down = &H7010201
cmdChatPush_SystemQuetion_Answer_Up = &H7000300
cmdChatPush_SystemQuetion_Ask_Down = &H7010301
cmdClose_Logout_Up = &H8000000
cmdClose_Logout_Down = &H8010001
cmdPVar_PVar_Up = &H9000000
cmdPVar_PVar_Down = &H9010001
cmdPVar_PVar_Err = &H9010000
cmdPVar_PVarUpdate_Up = &H9000100
cmdPVar_PVarUpdate_Down = &H9010101
cmdPVar_PVarUpdate_Err = &H9010100
cmdInv_List_Up = &HA000000
cmdInv_List_Down = &HA010001
cmdInv_List_Err = &HA010000
cmdGive_Item2Other_Up = &HB000000
cmdGive_Item2Other_Down = &HB010001
cmdGive_Item2Other_Err = &HB010000
cmdSMS_List_Up = &HC000000
cmdSMS_List_Down = &HC010001
cmdSMS_List_Err = &HC010000
cmdGuild_Create_Up = &HD000000
cmdGuild_Create_Down = &HD010001
cmdGuild_Create_Err = &HD010000
cmdGuild_Invite_Up = &HD000100
cmdGuild_Invite_Down = &HD010101
cmdGuild_Invite_Err = &HD010100
cmdGuild_Quit_Up = &HD000200
cmdGuild_Quit_Down = &HD010201
cmdGuild_Quit_Err = &HD010200
cmdGuild_Status_Up = &HD000300
cmdGuild_Status_Down = &HD010301
cmdGuild_Status_Err = &HD010300
cmdGuild_UpdateStatus_Up = &HD000400
cmdGuild_UpdateStatus_Down = &HD010401
cmdGuild_UpdateStatus_Err = &HD010400
cmdGuild_Kick_Up = &HD000500
cmdGuild_Kick_Down = &HD010501
cmdGuild_Kick_Err = &HD010500
cmdGuild_ChangeOwner_Up = &HD000600
cmdGuild_ChangeOwner_Down = &HD010601
cmdGuild_ChangeOwner_Err = &HD010600
cmdGuild_Dismiss_Up = &HD000700
cmdGuild_Dismiss_Down = &HD010701
cmdGuild_Dismiss_Err = &HD010700
cmdGuild_ChangeRight_Up = &HD000800
cmdGuild_ChangeRight_Down = &HD010801
cmdGuild_ChangeRight_Err = &HD010800
End Enum
/**/''' <summary>
''' 包的標識
''' </summary>
Property Flag()Property Flag() As PackFlag
End Interface
End Namespace
IWorkingPack
Code
'-------------------------- ---
' Wayne Wang
' 個人研究
' 不是什麼了不起 的東西
' 有錯誤的話還請告訴我
' 努力奮斗
' Yeah!
'-----------------------------
Namespace CommonNamespace Common
Public Interface IWorkingPackInterface IWorkingPack
Inherits IPack
/**/''' <summary>
''' 根據路徑讀取包的內容
''' </summary>
''' <param name="routeArray">讀取包內數據樹的某個位置 數組表示路徑</param>
Function LocateValue()Function LocateValue(ByVal routeArray As Int32()) As IWorkingPackNode
/**/''' <summary>
''' 根節點
''' </summary>
Property RootValueNode()Property RootValueNode() As IWorkingPackNode
End Interface
End Namespace
IWorkingPackNode
Code
Namespace CommonNamespace Common
Public Interface IWorkingPackNodeInterface IWorkingPackNode
Property Name()Property Name() As String
Property Value()Property Value() As Object
Property ChildNodes()Property ChildNodes() As IList(Of IWorkingPackNode)
Property Attritues()Property Attritues() As IDictionary(Of String, Object)
End Interface
End Namespace
今天文件太多了 太麻 煩了 其他的部分 我打包好了。。。