游戏大厅 从基础开始(3)——最吸引眼球的部分 客户端与服务器的连接

游戏大厅 从基础开始(3)

——最吸引眼球的部分 客户端与服务器的连接

 

看了上篇随笔的回复 发现大家都很关心如何实现连接。

 

但是本节可能不会涉及到数据连接的具体实现。

 (补充: tcp实现封装已经完成  请参考  http://www.cnblogs.com/waynebaby/archive/2009/01/14/1375234.html

盲目的实现连接 而不试图从更高的位置来考虑连接的作用,只能徒增耦合。

而网络传输的实现各有特点,耦合过高的话 ,稍不注意业务逻辑就会成为通讯协议的牺牲品。

这种状况 往往让我们产生"只能针对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

 

ContractedBlock.gif ExpandedBlockStart.gif Code

'-----------------------------
'
         Wayne Wang 
'
          个人研究 
'
    不是什么了不起的东西 
'
    有错误的话还请告诉我
'
          努力奋斗
'
            Yeah!
'
-----------------------------


ExpandedBlockStart.gifContractedBlock.gif
Namespace CommonNamespace Common


ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Interface IPackInterface IPack



ExpandedSubBlockStart.gifContractedSubBlock.gif        
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

ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**/''' <summary>
        
''' 包的标识
        
''' </summary>

ExpandedSubBlockStart.gifContractedSubBlock.gif        Property Flag()Property Flag() As PackFlag





    
End Interface


End Namespace

IWorkingPack

 

ContractedBlock.gif ExpandedBlockStart.gif Code

'-----------------------------
'
         Wayne Wang 
'
          个人研究 
'
    不是什么了不起的东西 
'
    有错误的话还请告诉我
'
          努力奋斗
'
            Yeah!
'
-----------------------------


ExpandedBlockStart.gifContractedBlock.gif
Namespace CommonNamespace Common


ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Interface IWorkingPackInterface IWorkingPack
        
Inherits IPack


ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**/''' <summary>
        
''' 根据路径读取包的内容
        
''' </summary>
        
''' <param name="routeArray">读取包内数据树的某个位置 数组表示路径</param>

ExpandedSubBlockStart.gifContractedSubBlock.gif        Function LocateValue()Function LocateValue(ByVal routeArray As Int32()) As IWorkingPackNode


ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**/''' <summary>
        
''' 根节点
        
''' </summary>

ExpandedSubBlockStart.gifContractedSubBlock.gif        Property RootValueNode()Property RootValueNode() As IWorkingPackNode



    
End Interface

End Namespace

 

 IWorkingPackNode

ContractedBlock.gif ExpandedBlockStart.gif Code
ExpandedBlockStart.gifContractedBlock.gifNamespace CommonNamespace Common

ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Interface IWorkingPackNodeInterface IWorkingPackNode
ExpandedSubBlockStart.gifContractedSubBlock.gif        
Property Name()Property Name() As String
ExpandedSubBlockStart.gifContractedSubBlock.gif        
Property Value()Property Value() As Object
ExpandedSubBlockStart.gifContractedSubBlock.gif        
Property ChildNodes()Property ChildNodes() As IList(Of IWorkingPackNode)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
Property Attritues()Property Attritues() As IDictionary(Of StringObject)
    
End Interface

End Namespace

 

 今天文件太多了  太麻烦了 其他的部分 我打包好了。。。

 

  http://files.cnblogs.com/waynebaby/Communicate.rar

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值