大佬们,我最近在对一个 UDP 服务器做性能测试。现在用的是阻塞的方法接收服务器返回的数据,但我发现接收到的数据包有可能是乱的。需要对数据包进行排序。 我在网上搜索后没有相关的解决办法。 现在我的想法是,服务器返回的内容中有一个字段可以表示发送的顺序。我提取这个字段后把这个字段和数据包内容放进一个字典里面,回调函数判断字典的键名,如果有对应的键名就执行对应的回调函数。 还有更好的方式吗?如果没有这个功能应该怎么实现呢? 感谢阅读,期待可以与你交流学习。
好吧,我终于大概理解你这里的顺序意思了。你这个 “排序” 有点混淆,实际你需要的是获取到一对基于同一个 pb 协议的请求包和响应包,然后响应包收到后根据里面自带的序号 + 你本地缓存的发送编号,反推出使用的是哪个 pb 协议,再反序列化出对应的 key value 数据,对吧?
有几个新的疑问: 1、这个和 UDP 有什么关系?你们的网络协议是一个请求包或响应包,只需要用一个 UDP 数据包表示?数据量大的情况不会涉及拆分包? 2、是否有看过开发的网络库是怎么做的,是否可以考虑使用开发已经封装好的网络库来做?pb 我理解只是序列化和反序列化,并且由于本身 pb 的序列化方式是去掉 key 只存 value 的,因此反序列化时如果不知道序列化时用的具体协议,是无法保障正确性的(比如两个协议里都是 3 个字段,且都是 int+str+int 类型,那这同一个数据在这两个协议下进行解析都是不会出错的),一般底层网络库实现时会通过一些自定义序号或者数据位来记录这个包对应的是哪个协议,方便做自动解析,不大可能会采用你现在的这种缓存所有请求数据并按序号倒推这种方式。
几个点没看明白: 1、你需要做的是排序还是什么工作?第一段写的是需要排序,第二段变成了执行回调,没明白之间关联是? 2、你排序的目的是做什么,是为了报告展示好看点还是为了正确整合被拆分的 udp 包?
从思路上,可以考虑在收到全部返回包后再根据服务端返回内容里发送顺序字段进行排序,这样不会额外增加性能测试中的压测机负荷,也不用担心顺序会有错。但如果是有别的需求所以要实时排序,那就要根据具体情况来设计了。
你好,我要测试的是登录时候的功能。这个过程需要向服务器发送多个数据包。发送的跟接收到的数据是通过 protobuf 序列化跟反序列化的,我接收到数据后需要根据发送时使用的协议写不同的处理方法。因此我需要对接收到的数据进行排序。 我现在的想法就是上面说的,把接收到的数据的编号放在一个字典里面,然后有一个循环一直在检查有没有对应编号的返回内容,如果有,就执行对应的处理数据的方法。
既然是 UDP 协议的,那我觉得你们测试也并不需要考虑排序的问题吧?如果对接受顺序要求这么严格,也不会用 UDP 了吧。
对的,就是你理理解的这样。 现在只是做登录,登录的信息不会非常大,因此没考虑分包问题。 我还没有看过开发的代码,你提供了一个非常棒的思路,我可以参考下开发他们的代码,谢谢!
昂,应该是不用排序的,可能是我走进了死胡同。
UDP 本来就不保证顺序,并且可能丢包。 看你描述还是登录这种功能,确认用的是 UDP?
是 UDP, 我不是很理解为什么开发选择这个协议