unity3D学习之网络通讯层设计.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
unity3D学习之网络通讯层设计

??????? 首先,请接触过unity中的Network网络层功能的童鞋注意,本文中出现的“Network”字样(如NetworkStream类),与Unity中的Network没有任何关系,请注意区分。实际上,本系列除最后部分会将客户端网络层与Unity工程进行对接,其余部分都不会与Unity有任何联系。 ?????? ??????? 其次,本人才疏学浅,虽添为某网游的服务器端主程,但其实也是赶鸭子上架,基础知识可能还没有各位看官扎实,所以文中难免有疏漏和贻误,写这篇文章也只是为印证心中所想的随手笔记,各位看官如果发现有错误或不规范之处,还望不吝赐教,我会马上修正,以免这些错误误导他人。 言归正传,首先是一些本文中可能会出现的基本概念的简单介绍。 ? ???????C/S结构:C/S结构中的C,是Client(客户端)的缩写,S,即是Server(服务器端)的缩写,顾名思义,就是客户端发送请求,服务器端负责处理请求并将处理结果返回给客户端,客户端负责展示的一种结构。 ? ? ????? ?短连接与长连接:短连接是指通讯双方有数据交互时,就建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送(百度百科)。相对于短连接,长连接是在一次交互过程中一直保持连接,期间可能会完成多项业务的发送或接收。长连接的好处是只建立一次连接,缺点是对服务器端压力比短连接要大(因为服务器端要维持所有的连接)。一般网游都会使用长连接,少数与服务器端交互比较少,不需要太注重客户端的数据安全问题,以及不注重与其他玩家的交互功能的游戏会使用短连接。文章来自【狗刨学习网】 ? ? ????? 粘包与分包:指TCP协议中,发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾(百度百科)。粘包的出现原因有很多,大家不必在意这些细节,有兴趣的看官可以自行百度 ? ??? “socket的半包,粘包与分包的问题”。 ? ????? 协议:客户端与服务器端约定好的数据解析格式。 ?????? 本文的最终目的,是完成一整套的客户端/服务器端的收发包,以及对Socket包的粘包和分包的处理,并包含一种本人实验性质的协议解析算法。 ?????? 今天先为大家奉上第一部分,一套基于TcpListener的收发包范例。 ? ??????? 我将会对代码中的重点部分单独提取出来进行简单的分析,帖子最下面是完整的工程,本人是使用的VS2013,如果下载下来用其他版本的VS无法加载,各位可以用自己的VS新建一个控制台项目工程,然后将Programs文件覆盖,将其他cs代码文件加入项目即可。 ? 服务器端部分: public void OnConnect(string sip, int port) { IPAddress adr = IPAddress.Parse(sip); tcpServer = new TcpListener(adr, port); tcpServer.Start(); } 启动TcpListener监听。 private void StartListen() { while (true) { TcpClient tcpClient = tcpServer.AcceptTcpClient(); ClientConnection cc = new ClientConnection(tcpClient); Console.WriteLine(cc.connectionDesc + connected.); cc.RawSendPacket(Hello client + cc.connectionDesc); } } ????? ?????? 这里的while(true)的死循环的作用是在服务器端运行过程中一直保持监听是否有新的客户端连接来。?????????????????????? ClientConnection是一个我们自己封装的类,目的是暴露一些经常需要调用的接口,如connectionDesc(客户端连接的套接字,是一个类似192.168.1.100:7039这样的字符串),以及将读包和发包的逻辑封装起来。 ? public void BeginRead() { byte[] bytes = new byte[1024]; clientStream.BeginRead(bytes, 0, 1024, ReadDone, bytes); } ? 异步读包写法。 ? private void ReadDone(IAsyncResult ar) { byte[] bytes = (byte[])ar.AsyncState; int iBytesAvalible = clientStre

文档评论(0)

aicencen + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档