MongoDB操作-删
同步移除一条数据设定好移除条件FilterDefinition后,使用collection.DeleteOne
12345678910111213141516171819202122#region 移除数据/// <summary>/// 移除一行数据/// </summary>/// <typeparam name="T">实体类</typeparam>/// <param name="collName">表名</param>/// <param name="objectId">当前行的id</param>/// <returns>移除的结果</returns>public DeleteResult Delete<T>(string collName, string objectId) where T : class, new(){ try { va ...
MongoDB操作-改
使用MongoDB修改数据时,需要先定义过滤条件,找到要修改的行,再定义修改内容
同步修改一行记录在MongoDBMgr里面添加Update方法
12345678910111213141516171819202122232425262728293031323334353637#region 修改数据/// <summary>/// 修改一行数据/// </summary>/// <typeparam name="T">实体类</typeparam>/// <param name="entity">实体</param>/// <param name="collName">表名</param>/// <param name="objectId">当前行的id</param>/// <returns>修改结果</returns>public UpdateResult Up ...
MongoDB操作-增
MongoDB初始化首先在SimpleServer解决方案里添加新的类库,命名为MongoDB。
打开Nuget包管理器,搜索“MongoDB”,给MongoDB项目添加“MongoDB.Bson”、“MongoDB.Driver.Core”和“MongoDB.Driver”,然后再引用ServerBase项目。
给SimpleServer项目添加MongoDB项目的引用。
在MongoDB项目添加MongoDBMgr
1234567891011121314151617181920using MongoDB.Driver;namespace MongoDB{ public class MongoDBMgr : SingletonPattern<MongoDBMgr> { private const string m_DBConnect = "mongodb://127.0.0.1:27017";//在服务器中也是本地连接,但如果是购买的阿里云的云数据库MongoDB,需要按照提示填写 priva ...
介绍与安装
MongoDB介绍MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。
MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
特点
MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。(也就是以文件的形式存储在磁盘里)
你可以在MongoDB记录中设置任何属性的索引 (如:FirstName=”Sameer”,Address=”8 Gandhi Road”)来实现更快的排序。
你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上,这就是所谓的分片。
MongoDB支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
Mo ...
客户端断线自动登录
我们在之前写了断线重连的内容
客户端断线重连
接下来把自动登录的部分补上。由于我们并没有具体写自动登录的逻辑,所以大部分是伪代码。
123456789101112131415161718192021222324252627using SimpleServer.Business; public void Update() { //... //断开连接后,连接服务器自动登录 //注意,只有确定了客户端点击登录过才能自动登录,这里没有加上这步判断 if(!string.IsNullOrEmpty(SecretKey) && m_Socket.Connected && m_IsReconnect) { //在本地保存了账户的token,使用token自动登录 //下面是伪代码 //ProtocolManager.LoginRequest(LoginType.Token, "userNam ...
注册登录协议
服务端创建协议首先在SimpleServer项目中的ProtocolEnum中添加新的协议类型
12345678910public enum ProtocolEnum{ None = 0, MsgSecret = 1,//密钥协议 MsgPing = 2,//心跳包协议 MsgRegister = 3,//注册协议++ MsgLogin = 4,//登录协议++ MsgTest = 9999}
然后在SimpleServer项目的Proto文件夹内新建LoginMsg文件。
123456789101112131415161718192021222324252627282930313233343536373839404142434445using ProtoBuf;using SimpleServer.Business;[ProtoContract()]public class MsgRegister : MsgBase{ public MsgRegister() { Proto ...
注册登录
服务器注册函数在SimpleServer项目的Business文件夹内新建UserManager和ServerEnum,并将MySql项目依赖过来
ServerEnum储存注册的结果枚举、登录结果的枚举、注册类型的枚举和登录类型的枚举,和ProtocolEnum差不多,这个文件和客户端通用:
1234567891011121314151617181920212223242526272829303132333435namespace SimpleServer.Business{ public enum RegisterType { Phone,//手机号码注册 Mail,//邮箱注册 QQ, WX } public enum LoginType { Phone, Mail, WX, QQ, Token } public enum RegisterResult ...
数据库准备
使用SqlSugar作为ORM框架。
SqlSugar .Net ORM 5.X 官网 、文档、教程 - SqlSugar 5x - .NET果糖网 (donet5.com)
导入Nuget包在服务器的SimpleServer解决方案中添加新的类库,命名为“MySql”。在此类库项目中进行SqlSugar的初始化和存放数据库对应的类。
在MySql项目中添加文件夹,命名为MySQLData,并且将自动生成的Class1文件从解决方案资源管理器中命名为MySqlMgr。
点击“工具——Nuget包管理器——管理解决方案的Nuget程序包”,在打开的界面中搜索“SqlSugarCore”,点击后安装在MySql类库项目中。
最后再在解决方案资源管理器中选中“MySql——依赖项——右键”,在弹出的窗口中选择“ServerBase”并确定。
新建数据库MySQL摘要
我们依然使用wampServer和Navicat建数据库,具体过程参见连接。
我们不需要新连接,只需要在之前的localhost_3306里新建一个sulsugartest数据库,使用utf8字符集,使用utf8-general ...
断线重连
客户端遇到网络不稳定断线时或者切换网络时,就要进行重连。注意断线重连和自动登录是两个步骤,这里我们先讲网络不稳定断线重连。切换网络和自动登录在后面补充。
普通断线重连在NetManager中添加m_IsDisconnected变量、m_IsFirstConnected和m_IsReconnect变量,第一个表示是否已经断线,第二个表示是否是第一次成功连接服务端,第三个表示是否是重连
123456//链接状态private bool m_IsConnecting;private bool m_IsClosing;private bool m_IsDisconnected;//+++private bool m_IsFirstConnected;//+++private bool m_IsReconnect;//是否是重连,用于自动登录
在NetManager的ReallyClose方法中,将m_IsDisconnected变量设为true
123456789void ReallyClose(bool normal = true){ SecretKey = "& ...
分包和粘包测试
分包测试进行分包测试,同时也演示一下客户端和服务器添加新协议的流程。
MsgTest协议新的协议命名为MsgTest,首先在ProtocolEnum里面声明
12345678public enum ProtocolEnum{ None = 0, MsgSecret = 1,//密钥协议 MsgPing = 2,//心跳包协议 MsgTest = 9999,//分包测试}
然后再在SysMsg里面添加MsgTest协议具体内容
123456789101112131415[ProtoBuf.ProtoContract()]public class MsgTest : MsgBase{ public MsgTest() { ProtoType = ProtocolEnum.MsgTest; } [ProtoBuf.ProtoMember(1)] public override ProtocolEnum ProtoType { get; set; } ...