AgileEASNETSOA中间件平台NetSocket通信框架-完整.doc_第1页
AgileEASNETSOA中间件平台NetSocket通信框架-完整.doc_第2页
AgileEASNETSOA中间件平台NetSocket通信框架-完整.doc_第3页
AgileEASNETSOA中间件平台NetSocket通信框架-完整.doc_第4页
AgileEASNETSOA中间件平台NetSocket通信框架-完整.doc_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍一文之中我们对AgileEAS.NET SOA中间Socket/Tcp框架进行了总体的介绍,我们知道AgileEAS.NET SOA中间件Socket/Tcp框架是一套Socket通信的消息中间件:二、多人在线聊天室系统 在文章AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答给大家实例介绍了有关于AgileEAS.NET SOA 中间件Socket通信框架的简单应用之后,我们通过文章AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置向大家展示了一个完整成熟的.NET Socket 通信框架的应用案例,一个从在线聊天室系统,通过文章向大家讲解了如何下载和编译安案例源代码、以及如何配置服务端和客户段。 相对于简单的客户端=服务端消息请求与应答的例子而言,在线多人聊天室系统的复杂度都要超过客户端=服务端消息请求例子N多倍,但是限于文章篇幅的原因,我们没有在文章AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置这中为大家介绍这个案例的具体代码。 下面我将为大家介绍这个案例的关键代码及阅读、理解、修改完善所需要注意的地方。三、关于代码编译环境及其他的地些设置 本案例的源代码在下载压缩包的Code目录之中,所有的引用AgileEAS.NET SOA 中间件平台的程序集及客户端、服务端运行所必须的文件都在下载压缩包的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.NET SOA服务进程的SocketService插件以及服务端收到客户端各种消息的消息处理器代码。 ChatingRoom.MainClient:为客户端代码、包括客户段界面以及客户端收到通信消息的消息处理器代码。五、关于SOA服务SocketService插件 如果对比AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答,细心的朋友一定会发现本案例中没有了类似Socket.Demo.Server功能的项目,而是多了ChatRoom.Socket项目。 关于这个问题就涉及到了AgileEAS.NET SOA 中间件平台的SOA服务实例及Socket框架的设计,在SOA服务实例本身被设计成为了一个可以运行WCF、WS、Socket等各吃点通信及其他应用服务的运行容器,那么我们的Socket服务端也可以在此服务实例之中运行,同时在我们的AgileEAS.NET SOA中间件平台的微内核程序集EAS.MicroKernel.dll之中定义了SocketService插件的实现标准: 1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: using EAS.Distributed; 6: 7: namespace EAS.Sockets 8: 9: / 10: / SocketService服务接口定义。 11: / 12: / 13: / 一个Socket服务器可以承载多种/个Socket服务,一个Socket服务处理一种业务。 14: / 如IM SocketService 处理IM相关的即时通讯业务,而WF SocketService 处理工作流相关的服务,这两种Socket服务可以同时运行在一个Socket服务器之中。 15: / 16: public interface ISocketService:IAppService 17: 18: / 19: / 使用ServerEngine初始化SocketService。 20: / 21: / Socket服务器对象。 22: void Initialize(ISocketServerBase socketServer); 23: 24: ISocketService接口中定义了一个初始化方法:void Initialize(ISocketServerBase socketServer),用于SOA服务实例完成对ISocketService实例的初始化,其中传入参数为一个ISocketServerBase对象,其本质的含义为SOA服务实例调用ISocketService实例对象把SOA服务实例之中的SocketServer对象做为参数传入,那么我们就可以在ISocketService对象之中针对SocketServer做一些初始化工作,其中最重要的工作是,挂载与之相关的消息对象器IMessageHandler。 ChatRoom.Socket项目之中包括了一个ISocketService的实现ChatRoom.Socket.MessageService 1: using EAS.Loggers; 2: using EAS.Sockets; 3: using System; 4: using System.Collections.Generic; 5: using System.Linq; 6: using System.Text; 7: 8: namespace ChatRoom.Socket 9: 10: / 11: / 聊天室消息服务,由EAS.SOA.Server.Exe引擎的Socket初始化程序。 12: / 13: public class MessageService : ISocketService 14: 15: #region ISocketService 成员 16: 17: public void Initialize(EAS.Sockets.ISocketServerBase socketServer) 18: 19: try 20: 21: socketServer.AddHander(new ChatMessageHandler(); 22: socketServer.AddHander(new LoginMessageHandler(); 23: ChatRoomContext.Instance.SocketServer = socketServer; 24: 25: catch (System.Exception exc) 26: 27: Logger.Error(exc); 28: 29: 30: socketServer.SessionStarted += socketServer_SessionStarted; 31: socketServer.SessionAbandoned += socketServer_SessionAbandoned; 32: 33: 34: void socketServer_SessionStarted(object sender, NetSessionEventArgs e) 35: 36: Logger.Info(string.Format(Session:0 Started, e.Session.SessionID); 37: 38: 39: void socketServer_SessionAbandoned(object sender, NetSessionEventArgs e) 40: 41: Logger.Info(string.Format(Session:0 Abandoned, e.Session.SessionID); 42: 43: 44: /void socketServer_MessagerReceived(object sender, EAS.Sockets.MessageEventArgs e) 45: / 46: / Logger.Info(string.Format(MessagerReceived:0, e.Message.ToString(); 47: / 48: 49: 50: /void socketServer_MessageSend(object sender, EAS.Sockets.MessageEventArgs e) 51: / 52: / Logger.Info(string.Format(MessageSend:0, e.Message.ToString(); 53: / 54: 55: public void Start() 56: 57: 58: 59: 60: public void Stop() 61: 62: 63: 64: 65: #endregion 66: 67: 其中最重要的代码是Initialize函数之中挂载ChatMessage、LoginMessage两个消息的消息处理器代码: 1: socketServer.AddHander(new ChatMessageHandler(); 2: socketServer.AddHander(new LoginMessageHandler(); Socket插件服务的定义除了代码定义之外,还需要在AgileEAS.NET SOA 中间件有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: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 需要在 配置节中之中增加了一端: 1: 用于告诉SOA服务实例在启动的时候加载并初始化类型为“ChatRoom.Socket.MessageService,ChatRoom.Socket”的SocketService。六、注册用户数据库及Sqlite介绍 在线多人聊到室系统之中有登录、用户,那么也就必须有数据库,要存储这些注册用户的信息,为了方便这案例的使用和部署,我们选择了轻量级的Sqlite文件数据库,其特别是简单方便,对于小数据量存储非常好用,有关于Sqlite的知识请自己从网上学习,本人使用的sqlite管理工具为SQLite Expert。 注册用户表结构如下: CHAT_USER(聊天室用户表)表名CHAT_USER所有者dbo列名数据类型空说明LOGINIDNVARCHAR(64)N登录IDNameNVARCHAR(64)Y用户名PASSWORDNVARCHAR(64)Y密码MAILVARCHAR(128)Y邮件SafeKeyNVARCHAR(64)Y密码找回问题SafeResultNVARCHAR(64)Y密码找回答案STATEBITY状态REGTIMEDATETIMEY注册时间 有关针对CHAT_USER表的数据访问使用了AgileEAS.NET SOA中间件平台的ORM及与之配套的Linq进行访问,其对应的ORM实体对象为ChatRoom.Entities.User: 1: using System; 2: using System.Linq; 3: using System.ComponentModel; 4: using System.Data; 5: using EAS.Data; 6: using EAS.Data.Access; 7: using EAS.Data.ORM; 8: using EAS.Data.Linq; 9: using System.Runtime.Serialization; 10: 11: namespace ChatRoom.Entities 12: 13: / 14: / 实体对象 User(聊天室用户表)。 15: / 16: Serializable() 17: Table(CHAT_USER,聊天室用户表) 18: partial class User: DataEntity, IDataEntity 19: 20: public User() 21: 22: this.RegTime = DateTime.Now; 23: 24: 25: protected User(SerializationInfo info, StreamingContext context) 26: : base(info, context) 27: 28: 29: 30: #region O/R映射成员 31: 32: / 33: / 登录ID 。 34: / 35: Column(LOGINID,登录ID),DataSize(64),PrimaryKey 36: DisplayName(登录ID) 37: public string LoginID 38: 39: get; 40: set; 41: 42: 43: / 44: / 用户名 。 45: / 46: Column(Name,用户名),DataSize(64) 47: DisplayName(用户名) 48: public string Name 49: 50: get; 51: set; 52: 53: 54: / 55: / 密码 。 56: / 57: Column(PASSWORD,密码),DataSize(64) 58: DisplayName(密码) 59: public string Password 60: 61: get; 62: set; 63: 64: 65: / 66: / 邮件 。 67: / 68: Column(MAIL,邮件),DataSize(128) 69: DisplayName(邮件) 70: public string Mail 71: 72: get; 73: set; 74: 75: 76: / 77: / 密码找回问题 。 78: / 79: Column(SafeKey,密码找回问题),DataSize(64) 80: DisplayName(密码找回问题) 81: public string SafeKey 82: 83: get; 84: set; 85: 86: 87: / 88: / 密码找回答案 。 89: / 90: Column(SafeResult,密码找回答案),DataSize(64) 91: DisplayName(密码找回答案) 92: public string SafeResult 93: 94: get; 95: set; 96: 97: 98: / 99: / 状态 。 100: / 101: Column(STATE,状态) 102: DisplayName(状态) 103: public int State 104: 105: get; 106: set; 107: 108: 109: / 110: / 注册时间 。 111: / 112: Column(REGTIME,注册时间) 113: DisplayName(注册时间) 114: public DateTime RegTime 115: 116: get; 117: set; 118: 119: 120: #endregion 121: 122: 针对CHAT_USER表的用户登录、注册验证、找回密码等代码的实现在ChatRoom.BLL.Host.UserService之中: 1: using System; 2: using System.Collections.Generic; 3: using System.Linq; 4: using System.Text; 5: using EAS.Services; 6: using ChatRoom.Entities; 7: using EAS.Data.ORM; 8: using EAS.Data.Linq; 9: 10: namespace ChatRoom.BLL 11: 12: / 13: / 账号服务。 14: / 15: ServiceBind(typeof(IUserService) 16: public class UserService : IUserService 17: 18: public void AddUser(User user) 19: 20: using (DbEntities db = new DbEntities() 21: 22: user.RegTime = DateTime.Now; 23: int count = db.Users.Where(p = p.LoginID = user.LoginID).Count(); 24: if (count0) 25: 26: throw new System.Exception(string.Format(已经存在账号为0的用户, user.LoginID); 27: 28: 29: db.Users.Insert(user); 30: 31: 32: 33: public User UserLogin(string loginID, string password) 34: 35: using (DbEntities db = new DbEntities() 36: 37: var v = db.Users.Where(p = p.LoginID = loginID).FirstOrDefault(); 38: if (v = null) 39: 40: throw new System.Exception(string.Format(不存在登账号称为0的用户, loginID); 41: 42: 43: if (v.Password != password) 44: 45: throw new System.Exception(密码不正确定); 46: 47: 48: return v; 49: 50: 51: 52: public bool UserExists(string loginID) 53: 54: using (DbEntities db = new DbEntities() 55: 56: int count = db.Users.Where(p = p.LoginID = loginID).Count(); 57: return count 0; 58: 59: 60: 61: public string GetSafeKey(string loginID) 62: 63: using (DbEntities db = new DbEntities() 64: 65: var v = db.Users.Where(p = p.LoginID = loginID).FirstOrDefault(); 66: if (v != null) 67: 68: return v.SafeKey; 69: 70: else 71: 72: return string.Empty; 73: 74: 75: 76: 77: public string GetSafeResult(string loginID) 78: 79: using (DbEntities db = new DbEntities() 80: 81: var v = db.Users.Where(p = p.LoginID = loginID).FirstOrDefault(); 82: if (v != null) 83: 84: return v.SafeResult; 85: 86: else 87: 88: return string.Empty; 89: 90: 91: 92: 93: 94: public void ChangePassword(string loginID, string password) 95: 96: using (DbEntities db = new DbEntities() 97: 98: db.Users.Update(p = new User Password = password , p = p.LoginID = loginID); 99: 100: 101: 102: 七、关于在线用户清单的管理 系统中如何知道目有那些用户在线,参考以上六节的内容我们可以知道,用户的主键是账号ID,与SocketServer之中在线清单NetSession没有特定的关系,那么如何建立这种关系,多而得到目前有那些用户在线呢,在ChatRoom.Socket项目之中我们定义了LoginInfo对象: 1: using EAS.Sockets; 2: using System; 3: using System.Collections.Generic; 4: using System.Linq; 5: using System.Text; 6: using ChatRoom.Entities; 7: 8: namespace ChatRoom.Socket 9: 10: / 11: / 消息信息类。 12: / 13: public class LoginInfo 14: 15: / 16: / 登录账号。 17: / 18: public string LoginID 19: 20: get; 21: set; 22: 23: 24: / 25: / 用户对象。 26: / 27: public User User 28: 29: get; 30: set; 31: 32: 33: / 34: / 会话。 35: / 36: public NetSession Session get; set; 37: 38: 39: 我们看源代码就可以明确的知道,他是一个用于建立NetSession与登录用户LoginID/User对象的影射类,即某个登录用户是在那个网络会话这上,我们在ChatR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论