一个数据库对应一个SqlSugarClient
一个表对应一个实体类
一个数据库对应一个SqlSugarClient
一个表对应一个实体类
SqlSugar是.Net版本,可以在NuGet上下载。
MySql是类库形式新建的。
1.客户端发送消息用BeginSend,用到队列。
2.客户端接收消息用BeginReceive,用到队列。
3.服务器发送消息用BeginSend,没有队列。
4.服务器接收消息用Receive,没有队列。
第一次,1024接收不全
第二次,2048接收不全
第三次4096接收完整
第一次读取,读满所有缓存1024个,然后执行OnReceiveData,发现消息长度未1225,接收不完整,返回。
第二次读取,发现Remain=0,先执行OnReceiveData,由于相同的原因未解析成功;紧接着扩充缓存为 2048,Remain=1024?;继续接收消息剩余部分;继续执行OnReceiveData,解析成功。
客户端按下A,给服务器发送ReqContent=“Ocean。。。。。。。。”,服务器回复RecContent=“服务器发送的数据”
ProtocolMgr是网络消息分发管理类,作为观察者,负责监听NetManager触发的事件,用拉姆达表达式作为监听函数,负责调用其他Manager的业务逻辑。
SecretKey密钥:当连接成功时,向服务器请求获取密钥;当连接关闭时,密钥置空。
m_Closing=true时,可以防止当前无待发送消息,确保关闭链接前,先把消息发送出去。
SendCallBack作为BeginSend的回调,当消息队列元素大于1时,可以实现递归调用,最终使元素数归零。所以下一次调用BeginSend前,只需判断元素数是否等于1即可。
Update只能在前台执行。
thread当IsBackground=true,可以在后台执行。
m_MsgCount是m_UnityMsgList的元素数目。
m_MsgCount在接收消息的线程内增加。
m_MsgCount的减少:①在消息处理线程中减少②在Unity的Update线程中减少。
客户端监听事件:用消息中心机制。
服务器端用的Select多路复用。
加载protobuf-net 2.4.4版本程序集。
用socket接收新数据之前,先确保缓冲区有空间,如果空间为0:
1.处理接收的数据;
2.数据移动到iRedIdx=0位置;
3.上面两项操作仍不起作用的话(已接收旧数据长度太大导致未接收完整),不断扩容缓冲区。
Length<8时,可视为能读的数据都读取完了。
1.需要在项目->Properties->Assemblyinfo.cs中增加对Log4net的配置:将Log4Net的配置文件路径信息添加进去。
2.log4net.config配置文件选择始终复制到输出目录。
类库不能获取到程序集z的类。
1.客户端没有获取密钥前,用公钥向服务器申请密钥。使用公钥加密“申请密钥协议”。
2.客户端获得密钥后,与服务器的通信采用密钥加密。
这里我没有采用message方式。我把升级武器、兵营。训练士兵花费的能量显示在按钮上,能量足够时,按钮可以交互,否则不能交互。这样写,代码稍微多了一点,但更直观,更方便交互。
为了降低游戏难度,我建了两个能量消耗策略,easy和normal,normal按照老师的来,easy按照开挂的来,永远不会死的游戏。等出士兵生成策略时,可以出个鬼畜模式,感觉有点好玩。