https://zhuanlan.zhihu.com/p/418293949
https://zhuanlan.zhihu.com/p/418293949
服务器日志
IO阻塞或非阻塞分为
同步 :
异步:
非阻塞性
多线程
发过来的信息存进队列
多路复用:
网络IO用的Select多路复用加阻塞。
AES加密协议对象时要求不能为空,所以让ProtoType在构造函数内赋值。
lsw:建议在连接失败的回调里面设置m_Diaoxian = true;//确保一直尝试重连
在Update中检测断线重连。
在协程函数中每隔1秒,检测网络变化时断线重连。可以确保网络变化后马上进行重连,而不用等心跳包收不到了。改进方式是m_CurNetWork = Application.internetReachability在重连回调函数中赋值。
Application.internetReachability表示当前网络连接情况,当切换其他网络时,值会改变。
当(已登录过)断线并重新连接成功后,自动登录:利用PlayerPref(或easysave或objectprefabs...插件)保存的用户名和token登录。
这里用的伪代码。
验证码Code暂时用不到。
需要从NuGet安装MySql.data ,用于连接数据库。
ExecuteReturnIdentity()可以获取影响行的主键值。
token是方便客户端下次自动登录用的。本次登录成功后,服务器会给客户端一个新token。
loginDate可以用于判断下次自动登录时,token是否过期,本项目没有用到。
实体类内字段名一般应和数据库表内列名一致,否则需要标注别名。
一个数据库对应一个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,可以在后台执行。