一、AgileEAS.NETSOA中间件Socket/Tcp框架介绍在文章AgileEAS.NETSOA中间件平台.NetSocket通信框架-介绍一文之中我们对AgileEAS.NETSOA中间Socket/Tcp框架进行了总体的介绍,我们知道AgileEAS.NETSOA中间件Socket/Tcp框架是一套Socket通信的消息中间件:二、多人在线聊天室系统在文章AgileEAS.NETSOA中间件平台.NetSocket通信框架-简单例子-实现简单的服务端客户端消息应答给大家实例介绍了有关于AgileEAS.NETSOA中间件Socket通信框架的简单应用之后,我们通过文章AgileEAS.NETSOA中间件平台.NetSocket通信框架-完整应用例子-在线聊天室系统-下载配置向大家展示了一个完整成熟的.NETSocket通信框架的应用案例,一个从在线聊天室系统,通过文章向大家讲解了如何下载和编译安案例源代码、以及如何配置服务端和客户段。相对于简单的客户端==》服务端消息请求与应答的例子而言,在线多人聊天室系统的复杂度都要超过客户端==》服务端消息请求例子N多倍,但是限于文章篇幅的原因,我们没有在文章AgileEAS.NETSOA中间件平台.NetSocket通信框架-完整应用例子-在线聊天室系统-下载配置这中为大家介绍这个案例的具体代码。下面我将为大家介绍这个案例的关键代码及阅读、理解、修改完善所需要注意的地方。三、关于代码编译环境及其他的地些设置本案例的源代码在下载压缩包的Code目录之中,所有的引用AgileEAS.NETSOA中间件平台的程序集及客户端、服务端运行所必须的文件都在下载压缩包的Publish目录之中,所有项目的编译输出路径也都是在Publish目录,也就是所有项目不管是在Debug编译环境还是在Release编译环境都是输出在Publish目录之中,有关具体的设置请看下图:四、解决方案之中的项目说明ChatRoom解决方案之是共有ChatRoom.Entities、ChatRoom.BLL.Contracts、ChatRoom.BLL.Host、ChatRoom.Messages、ChatRoom.Socket、ChatingRoom.MainClient、ChatingRoom.UserManage共七个项目,其中:ChatRoom.Entities:是聊天室注册用启的数据存储实体,其中只包括一个实体User,。ChatRoom.BLL.Contracts:为用户管理、登录验证、密码找回修改等功能的分布式服务定义契约,其中仅包括一个服务契约定义IUserService(用户服务)。ChatRoom.BLL.Host:为ChatRoom.BLL.Contracts所定义的服务契约的功能实现。ChatRoom.Messages:服务端与客户端通信消息的定义,包括聊天消息、用户登录请求、登录结果、在线用户清单消息、用户上下线状态通知消息。ChatRoom.Socket:为服务端的业务代码、包括AgileEAS.NETSOA服务进程的SocketService插件以及服务端收到客户端各种消息的消息处理器代码。ChatingRoom.MainClient:为客户端代码、包括客户段界面以及客户端收到通信消息的消息处理器代码。五、关于SOA服务SocketService插件如果对比AgileEAS.NETSOA中间件平台.NetSocket通信框架-简单例子-实现简单的服务端客户端消息应答,细心的朋友一定会发现本案例中没有了类似Socket.Demo.Server功能的项目,而是多了ChatRoom.Socket项目。关于这个问题就涉及到了AgileEAS.NETSOA中间件平台的SOA服务实例及Socket框架的设计,在SOA服务实例本身被设计成为了一个可以运行WCF、WS、Socket等各吃点通信及其他应用服务的运行容器,那么我们的Socket服务端也可以在此服务实例之中运行,同时在我们的AgileEAS.NETSOA中间件平台的微内核程序集EAS.MicroKernel.dll之中定义了SocketService插件的实现标准:1:usingSystem;2:usingSystem.Collections.Generic;3:usingSystem.Linq;4:usingSystem.Text;5:usingEAS.Distributed;6:7:namespaceEAS.Sockets8:{9:///summary10:///SocketService服务接口定义。11:////summary12:///remarks13:///一个Socket服务器可以承载多种/个Socket服务,一个Socket服务处理一种业务。14:///如IMSocketService处理IM相关的即时通讯业务,而WFSocketService处理工作流相关的服务,这两种Socket服务可以同时运行在一个Socket服务器之中。15:////remarks16:publicinterfaceISocketService:IAppService17:{18:///summary19:///使用ServerEngine初始化SocketService。20:////summary21:///paramname=socketServerSocket服务器对象。/param22:voidInitialize(ISocketServerBasesocketServer);23:}24:}ISocketService接口中定义了一个初始化方法:voidInitialize(ISocketServerBasesocketServer),用于SOA服务实例完成对ISocketService实例的初始化,其中传入参数为一个ISocketServerBase对象,其本质的含义为SOA服务实例调用ISocketService实例对象把SOA服务实例之中的SocketServer对象做为参数传入,那么我们就可以在ISocketService对象之中针对SocketServer做一些初始化工作,其中最重要的工作是,挂载与之相关的消息对象器IMessageHandler。ChatRoom.Socket项目之中包括了一个ISocketService的实现ChatRoom.Socket.MessageService1:usingEAS.Loggers;2:usingEAS.Sockets;3:usingSystem;4:usingSystem.Collections.Generic;5:usingSystem.Linq;6:usingSystem.Text;7::namespaceChatRoom.Socket9:{10:///summary11:///聊天室消息服务,由EAS.SOA.Server.Exe引擎的Socket初始化程序。12:////summary13:publicclassMessageService:ISocketService14:{15:#regionISocketService成员16:17:publicvoidInitialize(EAS.Sockets.ISocketServerBasesocketServer)18:{19:try20:{21:socketServer.AddHander(newChatMessageHandler());22:socketServer.AddHander(newLoginMessageHandler());23:ChatRoomContext.Instance.SocketServer=socketServer;24:}25:catch(System.Exceptionexc)26:{27:Logger.Error(exc);28:}29:30:socketServer.SessionStarted+=socketServer_SessionStarted;31:socketServer.SessionAbandoned+=socketServer_SessionAbandoned;32:}33:34:voidsocketServer_SessionStarted(objectsender,NetSessionEventArgse)35:{36:Logger.Info(string.Format(Session:{0}Started,e.Session.SessionID));37:}38:39:voidsocketServer_SessionAbandoned(objectsender,NetSessionEventArgse)40:{41:Logger.Info(string.Format(Session:{0}Abandoned,e.Session.SessionID));42:}43:44://voidsocketServer_MessagerReceived(objectsender,EAS.Sockets.MessageEventArgse)45://{46://Logger.Info(string.Format(MessagerReceived:{0},e.Message.ToString()));47://}48:49:50://voidsocketServer_MessageSend(objectsender,EAS.Sockets.MessageEventArgse)51://{52://Logger.Info(string.Format(MessageSend:{0},e.Message.ToString()));53://}54:55:publicvoidStart()56:{57:58:}59:60:publicvoidStop()61:{62:63:}64:65:#endregion66:}67:}其中最重要的代码是Initialize函数之中挂载ChatMessage、LoginMessage两个消息的消息处理器代码:1:socketServer.AddHander(newChatMessageHandler());2:socketServer.AddHander(newLoginMessageHandler());Socket插件服务的定义除了代码定义之外,还需要在AgileEAS.NETSOA中间件有SOA服务实例配置文件之中进行定义,因为SOA服务实例程序有32位和64位版本,分别为EAS.SOA.Server.exe和EAS.SOA.Server.x64.exe,所以要根据自身的机器条件和自己喜欢的运行环境修改EAS.SOA.Server.exe.config或EAS.SOA.Server.x64.exe.config:1:?xmlversion=1.0?2:configuration3:configSections4:sectionname=eastype=EAS.ConfigHandler,EAS.MicroKernel/5:/configSections6:!--支持混合程序集--7:startupuseLegacyV2RuntimeActivationPolicy=true8:supportedRuntimeversion=v4.0/9:/startup10:eas11:configurations12:itemname=Keyvalue=Value/13:/configurations14:appserver15:channel16:wcfenable=true17:configtcpPort=6907httpPort=690