AgileEASNETSOA中间件平台NetSocket通信框架-完整.docx
一、Agi1.eEAS.NETSOA中间件SOCket"cp根架介18在文章AKi1.CEASNETSOA中间件平台.Ne1.SoCkc1.通信框架-介绍一文之中我们对AKi1.CEASNETSOA中间SOCket/Tcp框架进行了总体的介绍,我们知道gi1.eES.NETSOA中间件SocketZTcp框架是一套Socket通信的消息中间件:Agi1.eEAS.NETSoA中间件SOCket/Tcp框架结木二、多人在线号天室系统在文他iIcEAS.WTSOA中间件上陋Sckc1.通信框架-通单例/-实现简单的依芳缩卷户端消息应笠给大家实例介绍了有关于Agi1.eEAS.NETSOA中间件SOCket通信框架的简单应用之后,我们通过文章ARi1.eEAS.NETSoA"间件平台.NetSoCket通信框架-完整版J1.i例在?£十天:系蛟-下栽配置向大家展示了一个完整成熟的.NETSoCket通信框架的应用案例,一个从在线聊天空系统.通过文章向大家讲解了如何下载和编洋安案例源代码、以及如何配置效劳端和客户段”相对于简单的客户端二方效劳端消息请求与杭答的例子而*.在线多人新天室系统的发杂衣都要起过客户端二效劳端消息请求例了N多倍,但是限于文意篇Iff1.的原因,我们没有在文章g:3E1S.V:TSOA中间件丫介zWe迎:枢:在纹脚大空.系统-卜投田追这中为大家介绍这个案例的具体代码。下面我将为大家介绍这个案例的关键代码及阅读、理解、修改完善所需要注意的地方。三、关于代码译环境及其他的地些设Jt本案例的源代码在下领压缩包的CodO目录之中,所有的引用Agi1.eEAS.NETSOA中间件平台的程序集及客户端、效劳兴运行所必须的文件都在下我压缩包的PUbIiSh目录之中,所有工程的编译怆出路径也都是在Pub1.ishI1.录,也就是所有工程不管是在Debug编译环境还是在Re1.ease编译环境都是输出在Pub1.ishI1.录之中,有关具体的设置请看卜列图:St1.HWWSX9JE(N)4(:)WSOTtI):半倒M):话就SnyePU)口帐:rmtRoOm(7个双目)1.ChitingRoofTvMiinGitnt“日ChtgRoom.Us<rM3n3ge<3ChAtRoom.B1.1.CoMracttE<33ChtRoom.B1.1.Host33ChtRoom.Entrties,,多ChtRoomaM*Q9e>J*PropertiesAMg1.1.B。ChMMHy(S“9I/KMeS“gee,IogXReWhMC“g*CJ1.ogOwtMenage-Cs5OrUnexs5OnUneMm9cUrSutMwg4/曰ChtRocm.$o<ke<RUAAPubSuA力COM互提G;壬蛛C)生成序列化程字量(EX855安帐关万盒受分后3HI四、解决方案之中的工程说明ChatROom解决方案之足共有ChatRoon.Entities、ChatRoon.B1.1.ContractsChatRooa.B1.1.1.1.ost、ChatRooa.MessagesChatRooa.Socket>ChatingRm.MainC1.ientsChatingROom.IsUrMarUIge共七个工程.其ChatRocm.Entities:是聊天室注册用好的数掘存储实体.其中只包括个实体1.s°r,即注册用户信息.Chatitoo1.B1.1.Contneta:为用户管理、登录验证、密码找回修改等功能的分布式效劳定义契约.其中仅包括一个效劳契约定义IUSerSerViCe(用户效劳).ChatRoo1.B1.1.Host:为ChatRocxn.BI.!.Contracts所定义的效劳契约的功能实现.ChatBo<a.MeettCM:效劳端与客户端通信消息的定义,包括聊天消息、用户登录请求、登录结果、在线用户清华消息、用户上下线状态通知消息.ChatRooe.Socket:为效劳端的业务代眄、包括AgiIeEASNETSOA效劳进程的SOCkCtSerViCe插件以及效劳端收到客户湍各种消息的消息处理器代码.ChatingRooifainCHent:为客户湘代码、包括客户段界面以及客户端收到通信消息的消息处埋器代码.五、关于S(M效劳SOCketSendCe插件如果比照Mi1.CEAS.ETSOA中间件平价.itSockc1.通皤框架-简单例/戈现简单的彼劳尔喀户时消融应答.细心的朋友一定会发现本案例中没有了类似SOCket.Deo.Server功能的工程.而是多了ChatRoom.Socket工程.关干这个问时就涉及到了Agi1.eEAS.NETSoA中间件平台的SOA效劳实例及SoCket框架的设计,在SOA效劳实例本身被设计成为了一个可以运行WCF、峪、SOCket等各吃点通信及其他应用效劳的运行容器,那么我们的Socket效劳翊也可以在此效劳实例之中运行,同时在我们的Agi1.eEAS.NETSOA中间件平台的位内核程序集ES.MicroKerne1.d1.1之中定义TSOCketSerViCe插件的实现标准:1:usingSystem;2: usingSystem.Co1.1.ections.Generic:3: usingSystem.1.inq:1: usingSystem.Text;5: usingEAS.Distributed;6:7: namespaceEAS.Sockets8: 9: /<sumnury>10: /SoCkeISerViCe效劳接口定义。11: /<summary>12: /<remarks>13: /一个Socket效劳器可以承载多种/个SoCket效劳,一个SOCket效劳处理一种业务.14: /如IMSoCkeCSerViCe处理IM相关的即时通讯业务,WFSocketService处理工作流相关的效劳,这两种Socket效劳可以同时运行在一个SoCket效劳器之中。15: /<remarks>16: PUb1.iCinterfaceISocketService:IAppService17:18: /<summary>19: /使用SerVerEngine初始化SoCketSCrVice。20: /<suunary>21: /<paramname="socke1.Server”>Socke1.效劳器对象。<param>22: voidInitia1.izedSocketServerBasesocketServer);36: 1.ogger,1.nfo(string.Format(,Session:1.O,Started",e.Session.SessionID):37: 38:39: voidSocke1.ServerSessionAbandoned(objectsender,NetSessionEventArBse)40: (41: 1.ogger.Info(string.Format("Session:0?Abandoned*,e.Session.SessionID):42: 43:44: /voidSocketServerMessagerReccived(objectsender,EAS.Sockets.MessageEventArgso)45: /(46: /1.ogger.Info(string.Fonnat("MessagerReceived:”,e.Message.ToStringO):47: /48:49:50: /voidSocketServerMessageScnd(objectsender,EAS.Sockets.MessageEventArgso)51: /(52: /1.ogger.Info(string.FormatCrMessageSend:10)*1e.Message.ToStringO);53: /)54:55: pub1.icvoidStartO56: (57:58: 59:60: pub1.icvoidStopO61:62:63: 64:65: #endregion66: 67: 其中最理要的代码是InitiaIiZe函数之中挂载ChatMCSsageJoginYessage两个消息的消息处理器代码:1: Socke1.Seiver.AddHander(newChaIMesSage1.1.and1.er():2: SocketServer.AddHander(new1.oginMessageI1.and1.erO);SoCket插件效劳的定义除了代码定义之外.还需要在AgiIeES.NETSOR中间件有SOA效劳实例配理文件之中进行定义,因为SoA效劳实例程序有32位和64位版本,分别为EAS.SOA.Server.exe和EAS.SO.Server.x&1.exe,所以要根据自身的机渊条件和自己喜欢的运行环境修改ES.SO.Server.exe.config或EAS.SOA.Server,x64.exe.config:1: <?xm1.VerSion="1.0"?>2: <configuration>3: <configSections>1:<sectionname-*eas*type=*EAS.ConfigHand1.er,EAS.MicroKerne1.*/>5:<configSec1.ions>6: <!一支持混合程序集一7: <startupUSe1.CgaCyV2RuntimCACtiVatiOnPOIiCy="true”>8: <supporte<IRuntineversion=,v4.0>9: <startup>10: <eas>11: <configurations>12: <itemname=Key*va1.ue=*Va1.ue*>13: </configurations>14: <appserver>15: <channe1.>16: <wcfenab1.e=*true*>17: <configIcpPort=*-6907"h1.ipPor1.="6908">18: <serviceThrot11ingInaXCOnCUrrentCa1.Is128”maxConcurrcntInstances="128"maxConcurrentSessions="z256">19: <wcfServices>20: <wcfServicekey="Key"Iype=Fa1.ue">21: <wcfServices>22: <wcf>23:<socketenab1.e="1.rue”>24: <configtcpPort=,6906">25: <serviceThrott1.ingmaxConcurrence="8196”>26: <socketServices>27: <socke1.Servicekey="MessageService,type="ChatRoom.Socket.MessageService,C