当前位置: 首页 > news >正文

网页与网站设计什么是整体造型建筑行业数据共享平台网站

网页与网站设计什么是整体造型,建筑行业数据共享平台网站,技术支持 石家庄网站建设,营销型网站有哪些平台前言这真的是最后一篇有关基础框架的文章了#xff01;写到这里已经第七篇了orz之前的其实还是挺枯燥的#xff0c;都是些基础方面的东西#xff0c;并看不到什么有趣的内容可能是我把事情想的太复杂了吧#xff0c;所有东西都想做到能力范围内的最好#xff0c;尤其是这些…前言这真的是最后一篇有关基础框架的文章了写到这里已经第七篇了orz之前的其实还是挺枯燥的都是些基础方面的东西并看不到什么有趣的内容可能是我把事情想的太复杂了吧所有东西都想做到能力范围内的最好尤其是这些底层框架层次的东西不过这些东西真的很重要小游戏的话可能不会明显Unity的一大优势便在于可以快速地产出游戏原型来我这个项目整了这么久就一个TestView里面居然只有两个按钮233我这些东西也是考虑了许多生产环境中遇到过的问题不敢说是最优我也还是在学习嘛XD嘛等把网络框架也搭起来我们就能正式开始写游戏相关的逻辑啦~网络通信我们这游戏是个多人在线实时对战的游戏之前的坑里就是网络这块给搞崩了重新来设计网络这块使用原生TCP Socket进行通讯自定协议。这里主要先介绍客户端先把协议定下来这样之后介绍服务端的时候就不会和客户端有太大耦合了。当然一开始的话还是先弄一个最简单的服务端本项目计划使用Node.js开发最简单的服务端在某个端口上创建一个TCP服务器接收客户端传来的消息拼接一个字符串后返回。代码如下const net require(net);net.createServer(function(socket){console.log(有新的连接: socket.remoteAddress);socket.on(data, function(data){console.log(request: data);socket.write({pid:1,retCode:0});});socket.on(end, function(data){console.log(socket end);});socket.on(close, function(data){console.log(连接已断开);});socket.write(Hello!);}).listen(19621);复制代码客户端设计用两个类一个相对底层的SFTcpClient用户不直接使用这个类而是通过SFNetworkManager加一层封装这是个单例类可以在游戏运行过程中随时访问网络还有就是为了以后可能不仅仅使用一个SfTcpClient封装之后可以更优雅地管理多个TCP客户端。SFNetworkManager先看SFNetworkManager管理着若干个SFTcpClient通过后者的以下接口|方法|说明||--|--||void init(string, int, SFClientCallback, SFSocketStateCallback)|根据指定的IP地址端口以及相关回调初始化||void uninit()|关闭TCP客户端||void sendData(string)|往服务器发送数据||bool isReady|服务器是否就绪|首先是作为一个单例类应该有的内容私有的构造函数唯一的实例获取实例的方法private SFNetworkManager(){}private static sm_instance null;public static SFNetworkManager getInstance(){if (null sm_instance){sm_instance new SFNetworkManager();}return sm_instance;}复制代码然后是连接初始化public void init(){m_client new SFTcpClient();m_client.init(127.0.0.1, 19621, onRecvMsg, ret {dispatcher.dispatchEvent(SFEvent.EVENT_NETWORK_READY, new SFSimpleEventData(ret));});// 向上传递连接断开的事件m_client.dispatcher.addEventListener(SFEvent.EVENT_NETWORK_INTERRUPTED, e {dispatcher.dispatchEvent(e);});}复制代码void onRecvMsg(string)是处理服务端推送消息的回调函数void onRecvMsg(string msg){SFUtils.log(收到了 msg);}复制代码现在问题来了因为消息回调函数是在Socket子线程里调用的Unity里不允许在子线程中对场景中的物体进行修改所以要稍加改造让这些消息在主线程中处理。用一个队列子线程中收到的消息全加入到这个队列把内容存在内存里然后主线程通过update函数定期检查队列中是否还有未处理的信息有的话就全部取出来处理。void onRecvMsg(string msg){m_recvQueue.Enqueue(msg);}void update(){while (m_recvQueue.Count 0){string data m_recvQueue.Dequeue();SFUtils.log(收到了 data);}}复制代码SFTcpClient使用C# TCP Socket的异步实现。数据收发的子线程由系统管理。所有的方法都有对应的一对BeginXX和EndXX以接收数据为例try{if (!m_socket.Connected){throw new Exception(Socket is not connected);}byte[] data new byte[1024]; // 以1024字节为单位接收数据m_socket.BeginReceive(data, 0, data.Length, SocketFlags.None, result {int length m_socket.EndReceive(result); // length为实际接收到的数据长度if (length 0){m_callback(Encoding.UTF8.GetString(data)); // 转换为字符串并调用回调}else{// length为0说明网络已断开m_socket.close();SFUtils.logWarning(网络连接中断);dispatcher.dispatchEvent(SFEvent.EVENT_NETWORK_INTERRUPTED);}}, null);}catch (Exception e){SFUtils.logWarning(网络连接中断 e.Message);}复制代码其他像是连接发送都大同小异具体的完整代码可以查看文章末尾的完整代码链接。自定协议数据的首发暂时就先这样(当然有很多坑比如因为我使用原生TCP Socket来传输数据包数据多的时候必然会产生粘包的情况所以必须手动分包这个之后再说和接下来的内容关系不大要加的话直接在SFTcpClient里的sendData()方法和socketRecv()方法里修改就是了)网络中传输的数据使用JSON字符串发送和接收的时候客户端和服务端分别各自进行序列化和反序列化这里先只讨论客户端的实现。Unity提供了一个JsonUtility类有了这个类我们就能方便地进行对象和JSON之间的序列化和反序列化了。主要使用的是两个方法|方法名|作用||--|--||string JsonUtility.ToJson(object)|把一个对象转化成JSON字符串||T JsonUtility.FromJson(string)|把一个JSON字符串转化成指定类型的对象如果出错则抛出异常|请求请求类型均继承自基类SFBaseRequestMessage举一个例子// 基类public class SFBaseRequestMessage{public int pid; // 协议号public string uid; // 用户唯一ID};// 用户登陆登出[Serializable]public class SFRequestMsgUnitLogin : SFBaseRequestMessage{public SFRequestMsgUnitLogin(){ pid 1; }public int loginOrOut;};复制代码响应响应类型是类似的每个请求类型一定对应一个响应类型但反过来却不一定即一个协议拥有请求类型是拥有响应类型的必要非充分条件。同样是上面那个登陆的协议// 基类public class SFBaseResponseMessage : ISFEventData // 为了让响应结果也可以方便地作为事件数据传递{public int pid; // 协议号public int retCode; // 错误代码0表示成功};// 用户登陆登出[Serializable]public class SFResponseMsgUnitLogin : SFBaseResponseMessage{public const string pName socket_1; // pName作为SFEvent的事件名称public SFReponseMsgUnitLogin(){ pid 1; }};复制代码发送和接收发送非常简单创建一个sendMessage()方法接收参数类型为请求基类SFBaseRequestMessage先序列化然后直接丢给TCP Client来处理发送即可。public void sendMessage(SFBaseRequestMessage req){string data JsonUtility.ToJson(req);m_client.sendData(data);}复制代码接收稍微复杂点儿分两步首先把原始字符串转成SFBaseResponseMessage获取其协议号pid然后根据不同的pid再转成具体的响应类型。SFBaseResponse obj null;obj JsonUtility.FromJson(data);if (obj null){SFUtils.logWarning(不能解析的信息格式:\n data);}else{int pid obj.pid;string pName string.Format(socket_{0}, pid);if (pid 1){obj JsonUtility.FromJson(data)}// else if 更多协议else{SFUtils.logWarning(不能识别的协议号: {0}, 0, pid);obj null;}if (obj ! null){dispatcher.dispatchEvent(pName, obj);}}复制代码然后在其他地方添加相应协议的监听即可SFNetworkManager.getInstance().dispatcher.addEventListener(SFResponseMsgUnitLogin.pName, onRecvMsg);复制代码回调函数一定在主线程中被调用所以可以在里面放心地修改游戏场景。测试程序创建一个这样的UI0701点击连接服务器的按钮尝试连接服务器m_mgr SFNetworkManager.getInstance();m_mgr.init();m_mgr.dispatcher.addEventListener(SFEvent.EVENT_NETWORK_READY, result {SFSimpleEventData retCode result.data as SFSimpleEventData;if (retCode.intVal 0){m_infoMsg 服务器连接成功;}else{m_infoMsg 服务器连接失败;}});m_mgr.dispatcher.addEventListener(SFEvent.EVENT_NETWORK_INTERRUPTED, onInterrupt);m_mgr.dispatcher.addEventListener(SFResponseMsgUnitLogin.pName, onRecvMsg);复制代码在此之前启动服务端程序的话就会成功连接至服务器。0702同时会收到来自服务端的消息Hello!当然这个不符合我们的协议console面板可以看到程序无法解析这个字符串并忽略。然后点击发送消息按钮客户端程序会发送一个测试协议给服务端服务端就会收到$ node ./started有新的连接:::ffff:127.0.0.1request: {pid:1,uid:abc,loginOrOut:1}复制代码此时服务端返回字符串{pid:1,retCode:0}这就是一个标准的协议信息了程序解析后发现这是一个登陆成功的响应做出处理0703然后按CtrlC强制关闭服务端程序进程网络中断客户端也有对应的处理0704完整代码上面贴出的代码片段由于篇幅限制只保留了关键部分完整的代码可在我的github上找到
http://www.yutouwan.com/news/31387/

相关文章:

  • 爱网站排行wordpress菜单导航代码
  • 网站建设专家工作总结烟台平台公司
  • 可以玩小游戏的网站美食网页模板
  • 网站开发技术项目实战crm平台
  • 做一家网站费用吗发布网站需要多大空间
  • 网站的后期维护自己怎么做wordpress如何卸载主题
  • 描述网页设计流程做了个网站 怎么做seo
  • 登封 网站建设莱芜口镇
  • 黄冈网站制作公司腾讯云服务器10元一年
  • 网站跟域名备案数量网站建设吴中区
  • 福永网站建设多少钱长春网站公司
  • 青岛网站建设康之迅歌曲做网站背景音乐 侵权
  • 深圳房管局官网查询系统外贸网站如何seo推广
  • asia域名的网站建一个视频网站要多少钱
  • 网站视频是什么软件做的wordpress密码注册
  • 江门官网建站公司中文图片转wordpress
  • 网站速度优化方案旅游网站的系统建设的意义
  • 广州建站优化做现金贷的网站有哪些
  • 甘肃系统建站怎么用动画设计素材
  • 网站建设与管理 第2版wordpress淘宝客网站运营
  • 北京网站建设 招聘信息河南省建设监理协会官网
  • 怎么用APdiv做网站导航栏网站开发用户自定义排序方案
  • 网站升级维护期间能访问吗wordpress 微博】
  • 山东省城乡住房和城乡建设厅网站疏肝益阳胶囊有哪些功效与作用
  • 上海免费模板建站山东省工程建设协会网站
  • 有没有专门做老年婚介的网站哈尔滨建筑工程招聘信息
  • 购物类网站开发中国国家人才培训网官网
  • 网站开发流程百度文库wordpress网站数量管理插件
  • 网站关键词排名没有了商务软文写作
  • 杭州哪里找网站建设的兼职襄阳住房和城乡建设局网站首页