关于使用TCP或者其他链接方式时数据接收问题

12月29号我基本写完了这次抽奖服务器的代码并正式挂到外网测试。说说在这次编写代码中遇见的问题和总结一下自己的想法。

这次的功能要求不是很难,应该说是很简单的哪一种,基本上是逻辑理清楚了然后就可以一路写下去的那种。但是后来还是用了六个星期左右才将它完成。其最主要原因我个人认为还是归结与我自己对TCP/IP通信的不熟悉,还有就是在做的前期没有和相关人员讨论要用到的东西,以及自己对通信逻辑处理的错误思想。

在拿到策划书的那个星期,逻辑代码就写完了,很快的。前前后后加起来大概1200行代码左右。不是很多,用的都是很基础的知识。完了之后就一直在搞通信这块,首先是使用开源的Raknet来和数据服务器进行数据的交换和认证,然后是和Client的数据交换。看起来是很简单的。但是,就这一块,弄了近五个周。

由于没有用过这个Raknet的开源代码,主程这边就直接给我一个可用的现成代码。看了一下,不是很难,就是写了一些基本的东西。包括超时的处理,还有连接,断开,检测是否连接,创建字节流等。然后,我直接在这个基础上修改和添加了关于字节流的创建的一些方法。这个部分做的不是很快,也用了一个周左右。但是由于留在这里的一个小小的问题,导致了我后来调试了很久,这个待会再说。

和DCS通信完成之后,就开始和Client通信。很丢脸的说,这个代码也不是我的,是主程给的。使用的是TCP协议进行的通信。这边刚开始主程说用按照公司的要求来弄,所有的通信必须加上头部字节流,这个头部字节流就是公司自己定义的一些东西。但是后来不知道为什么client那边接收不正常,公司两个写服务器的都没能解决,后来就果断换了一种方式,不要头部,结果就正常了。我不明白这是为什么,但是有时间我回去写个dome看看。这样看起来似乎整个项目就完了,至少我当时是这样想的。

接下来开始测试,测试那边出来一个问题,说什么两个client同时连接服务器就会得到的相同的数据。后来一查,是随机种子的原因。关于这个上次写了一下记录。然后解决了。然后测试那边好像就没有问题了。这样似乎就验证了我的想法,项目完成了。

但是,悲剧才是刚刚开始。首先来的是,公司组织多人测试的时候发现数据的接收是不对的,A和B同时链接服务器,A可能收到B的数据,也就是数据开始交窜开来。这也就是说我的通信逻辑有问题。一查,果然是这样。刚开始我设计的时候想的是并行链接,但是设计出来时串行链接,也就是说Client发送请求道我的Server,然后我请求和DCS链接验证用户消息,然后自身逻辑处理,完了后就再次给DCS通信同步数据。然后DCS返回同步数据的结果。收到结果后,我这边才会返回数据给Client。这个逻辑里面有个很大的问题就是当多个用户同时请求数据的时候,服务器时不能够正确识别用户的。后来就修改这个逻辑,首先将接收DCS的数据的代码分开,让各自接收各自的数据。并且在TCP中将接受的用户信息用map存起来,然后在DCS数据返回来并且逻辑处理后的结果在map中查找并返回给client。这样基本上就解决了数据的交窜。

给张图,说明一下:


按照1237456这是刚开始的逻辑

这是改过来后的逻辑。


1237546,说一下改变了什么,可能很明显的是,这个改法就是不在等待DCS返回的来信息了.逻辑处理完后把结果返回DCS储存后直接发送给Clinet。这里面还有一个东西没有画出来,就是关于TCP的处理。以前是一路到底,现在是分开处理。TCP接收数据和发送数据分开来处理。发送数据发送完就结束了,然后while循环里一直去执行发送数据的函数,只要一段检测到有数据从逻辑返回来就发送出去。这样的就可以避免数据交窜。

但是还记得上面说过遇见的问题吗?关于Raknet等所有数据改好了才发现数据的发送总是超时,有时候只会超时一个连接,有时候所有连接都会超时。后来打印日志出来才发现问题出现在Raknet的数据流接收上面。那个上面是按照以前串行的代码来写的,每次接收数据要判断后都要睡眠2s的时间。这个代码明显在使用并行的时候不适用。

在这里顺便吐槽一下,测试的时候我问TA有什么问题没有,他说没有。好,那就没有。然后再测试的时候问题又出来了。我去这前前后后浪费了我好几天的时间。既然问题出来了那就改吧,改完测试,又没有问题,我还忒别问了一下说这这会真没有问题了吧。最后在一次大规模测试的时候问题又出来了。这前后又是几天,我真心不想说什么的了。我承认代码有问题是我的问题,但是你们的测试让我号蛋疼。这样导致项目进度那个拖的是一塌糊涂啊。

这样整个项目才完成。历时6个星期。说说我的感受吧,以前在学校以为TCP/IP不是很重要的,只要学好桌面编程就好了。现在看来你当时的想法太没有前瞻性了。如果不能和用户交互,桌面的软件写的再好也是白搭,尤其是像现在自己在写服务器的情况下。最近这段时间也在努力的补习通信原理,希望能够快点补起来吧。还有就是在写东西之前一定要和交互的对象商量好交互的协议,这点很重要啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值