对该玩具的设计思路以及及时的学习方式变换
思路整理
在上一节中我们说过,要搭建一个最简单的TCP/UDP模型,并且,要配合该模型做出一个测试工具,用来测试模型性能。今天中午我一直在想测试工具该怎么写,可是连模型都没出来,直接思考测试工具是不太对的,因为我们做的这个模型,它不像HTTP协议有固定格式的URL接口,所以市面上的测试工具都不太好搞(市面上大多是针对web接口测试的),所以我要先想好,这个模型的基本逻辑怎么做以及对应的测试工具怎么测。
首先用户在发起连接后(通常是登录业务),在断开连接之前,都是要与服务器保持一种长连接的状态,这个符合TCP的逻辑所以用TCP实现。那么相应地,测试工具就有一个功能,需要模拟不同用户长时间登录,测试工具不仅能发出请求,还要接收响应。然后在后台,模型可以实时显示当前连接数,当连接数量不稳定或者连接数量小于测试工具模拟的用户数量时,即可认为是达到了服务器能承载的最大用户连接数。在模型开发该功能时,可以先使用内存数据库,让用户信息贮存在内存中,用户信息的生存周期就是从用户连接成功开始到断开连接,这个内存数据库是必不可少的,因为在以后开发用户功能时,肯定有这样一个需求:当一个人断开连接时,需要通知其所有的在线好友对吧,游戏服务器中,类似的需求还有很多。之后,我们可以添加轻量级的关系型数据库用于持久存储账户信息,既然是做小游戏服务器,那肯定得有用户是吧。然后就是登录/注册,查询/添加/删除好友等基础功能。
以上所说的功能或需求,凡是涉及到网络通信的,应该都采用TCP实现。服务端与客户端,要协定好发送与接收的数据包内容里的格式,比如说前四个字节表示本次发送的总长度,第五个字节表示业务号(比如01是登录,02是注册)等。在客户端,不要把单一功能封装,比如说不应该把连接封装成一个按钮,应当是给一个输入框,测试人员可以输入要发送的内容,这样才能做到测试内容动态化。
在测试工具中,如何动态更换IP模拟不同用户连接是个问题,可以到时候研究一下。
编程技术之异步模式
在参考微软文档中的套接字编程时,看到使用async/await的异步模式,我之前这块没了解过,所以直接现在学习一下。大家不要觉得,学习套接字嘛代码复制粘贴就好了,我这人对复制粘贴的代码有个要求就是,要懂复制的代码什么意思,否则将来这段代码出问题了修都不知道怎么修,建议无论新老手都要有这个意识。
对了差点忘了讲,虽然在.NET API浏览器中对于System.Net.Sockets命名空间的描述是为需要严密控制网络访问的开发者提供 Windows 套接字 (Winsock) 接口的托管实现,但实际上这个命名空间里的套接字是支持跨平台的,一开始我看到Winsock还以为.NET6里的套接字只支持win系统,但又感觉怎么可能呢,.NET Core不是说好跨平台的么,还好在这个文档中我看到了这样一句话:
System.Net.Sockets 命名空间包含托管的跨平台套接字网络实现。 System.Net 命名空间中的所有其他网络访问类均建立在套接字的此实现之上。
Socket 类是基于与 Linux、macOS 或 Windows 的本机互操作性提供的托管代码版本的套接字服务。 大多数情况下,Socket 类方法只是将数据封送到其本机对等体中,并负责任何必要的安全检查。
所以如果看到那个描述不用怀疑,可能就是没有及时更新吧,System.Net.Sockets 里的东西是跨平台的。
然后继续说回异步模式,.NET里异步模式有三种,分别是基于任务的异步模式 (TAP),基于事件的异步模式 (EAP),异步编程模型 (APM) 模式,具体可以参考这篇文档。本来我想从APM到EAP再到TAP的,但是真的太麻烦了,每次回到家打开电脑,一看到要从最基础的搞起,我就感到烦躁和压力,然后不知道在干嘛,白白浪费了很多时间。也许有些人确实适合这种系统性的学习方式,但我认为它不适合我,我自认为我就是短时思维的人,需要用到什么知识,那就去找对应的知识点,其他的不重要的,那就再说,尽管这样可能会踩很多坑,很有可能做了一大堆,最后要重构,但没关系,其实这种情况我见得多了,但系统性的东西,恕我愚笨,更加不适合本人,因为最后都会忘记的,倒不如按着兴趣来,那才是我真正学编程的动力源。(我也希望大家都能找到适合自己的学习方式,当发现当前的学习模式不适合自己时,一定要即时切换思路,让自己多少能学一点东西,这种思路的切换不仅适用于编程的学习,同样适用于文化科的学习)
所以,你可以看到,我写的东西非常随意,思绪飞到哪里,段落就写到哪里,但是无所谓了,反正很大概率做出来的东西没人看也没人玩。
因为Socket编程中基本上只涉及到基于任务的异步模式,所以我们直接从该模式入手,哪里不懂就查哪里。同时,在该篇文章之后,文章结构会有较大改变,我希望能更加放飞自我的写文章,我希望是以目标驱动学习,引导自己提出问题,解决问题,而文章的结构也是围绕这样的思路组织结构。
从下一篇开始,我们直接切入正题,从最基本的Socket编程开始剖析!
浙公网安备 33010602011771号