乐趣区

关于python:用-Python写网络编程一

前言

游戏产业和互联网都是互通的,随着 Http2.0- 将来版本,以及更多行业也有更多非 Http 申请的工作工作。

协定曾经开始须要把握:
http 镞,websocket , 根底 Tcp, 根底 Udp
Rpc,webRtc,Tars,Kcp,ENet
序列化数据结构
Protobuf,Thrift,Json,xml

网络编程能力曾经缓缓成为测试人员的一项必备能力了。
拿游戏产业来说能够有以下作用:
1. 接口测试
2. 压力测试
3.mock- 造环境数据(须要附加 ssh 服务器,导入所有配置表,批改数据库)
4.mock-GM 工具(须要附加 Mock 和做一些相似数据库存储过程的性能)
5. 平衡性测试(老手疏导职业降级速度,抽卡,Pve 正本,Pvp 胜率,流动实现等)
6. 战斗验证(帧同步,状态同步)前后端在开发语言有不少小细节。
7. 日志文件同步
然而这块学习是有肯定难度的,一部分起因是因为不能和自动化(随时找个网页和 app)和 http 接口(有教学接口),有练手场景。前面练习,须要本人写服务端能力练习。
还有一部分是须要网络常识,心愿通过这个补全和把握这块的常识空缺。

网络编程

Client to Server 客户端负责 send 发送 音讯 —> 服务器
Server to Client 客户端负责 recv 接管 <—- 音讯 <—- 服务器
Server push Client 服务器被动推送给客户端的音讯,比方小红点,比方一些夹带触发的音讯,比方打怪降级了,服务器会 push 降级音讯给 Client.

这个外面细节是很多的。比方 C 和 S 两端链接是走了 message queue,服务器 mq 按帧去保留,比方最多保留 500 帧,每 500 帧革除一次。比方两头有压缩,签名或者加密,程序不能乱,比方内存对齐和补位。

这个外面发送的音讯,音讯是一个对象,对象有数据结构,这块是网络编程时最先须要学习。
在建设 socket 之后,socket 设置数据类型,必须设置根底的,Ipv4 还是 ipv6,数据流 (tcp) 还是数据包 (udp)
在建设链接也就是管道后,返回数据也有一些细节。
建设管道胜利后,也就是开始发包, 这个前面具体讲。

发送流程

Client–>(msg 原始数据容器) 缓存区 –>(二进制) 网卡 –>(二进制) 网关或者其余 –>(二进制) 服务器
这里留神,肯定要辨别内存里数据长得样子(给机器应用得)和本人看得(排错用得,根本都是用 16 进制)
本人看得就不能当成 msg 原始状态,比方 C# toString(“x2”) 就是转 16 进制,然而发得时候你转 16 进制发就不正确了。
为什么不能那么转,须要理解下不同字符的长度,有些字符是会在二进制转换环节被主动翻译去除字符的 比方 “\x”。

msg 原始数据容器 分为以下几种类型:
容器在这里就是内存外面装 msg 的,容器不是根底数据类型
1. 字符串 字符串没啥好说的,Python 不辨别 char 和 string,在应用时非二进制的,这个在转到网卡那边时还是会翻译成二进制的。
2. 字节 输入是 b 结尾的,阐明是 bytes, 多个 byte 组成的,也是字节数组,字节也能够拼接成长的字节。字符串转字节是通过 encode() 转换。
比方 “hello world”.encode() –>b’hello world’。这里做得就是通过编译器对字符串进行编码,进行编码时默认为 utf-8。utf-8 向下兼容 ascii 码。
3.bytearray bytes 都是一样,然而 bytearray 内存可变的。
内存可变和不可变怎么来辨别呢,因为下面三种数据类型肯定是迭代器,迭代器就是能够被遍历的。

t1 = "hello world"
t1[0] = "a"
t2 = "hello world".encode()
t2[0] = "a"
#下面这么写都是会抛错的,因为内存不可变

bytearray 能够应用 对象 [0] 去赋值。

t2 = bytearray([1,2,3])
t2[0] =4  
print(t2)  # \x04 就是因为 t2[0]批改了,bytearray(b'\x04\x02\x03')

可变和不可变在网络编程外面也是有关系的,不可变的能够用于形参,可变的不举荐用形参会,调用函数会多拷贝一个正本。

网络解决

下面三种根底的数据类型,bytes 和 bytearray 在原始状态下是二进制,大部分状况下,只须要应用 bytes 就能当网络编程的容器了。
这里要做到 客户端把原始数据进行打包投递到网关。
这里有个概念是 服务器并不是客户端发什么都接管的,所有客户端须要晓得服务器能接管什么数据类型(就是二进制对服务器来说会转换成什么)。
这里先不定义一个 socket 来回发,通过都是先要晓得本人发过来的是对的。

上面抉择用最常见的 bytes,题目为客户端须要发送 bytes 数据,每次不能超过 1450 个字节(最大传输单元),发送后果打印到控制台。
这里有个重要知识点,bytes 不是字节,是字节数组,一个 byte 占一个字节,根底数据类型 (局部援用数据类型) 在缓存区外面占不同的位数,所以能够了解为 bytes 的长度也就是这个字节数组的长度。

def session_bytes(datas: bytes,mtu:int=1450):
    """
    客户端须要发送 bytes 数据,网络字节序是大端
    每次最大传输单元 1450 个字节, 超过就分成 2 段传
    byteorder 代表主机字节序,big 是大端。.to_bytes(2,byteorder="big")的呈现是因为字节数组是二进制的,所以在遍历时在内存通过 ord()转换成了 int。:return:
    """msg =[b"",b""]
    if len(datas) >= mtu:
        for i in datas[:mtu]:
            msg[0] += i.to_bytes(2,byteorder="big")
        for i in datas[mtu:]:
            msg[1] += i.to_bytes(2,byteorder="big")
    else:
        for i in datas:
            msg[0] += i.to_bytes(2,byteorder="big")
    return msg

Python 语法不解释,留神看正文。msg 是有序,网络传输在应用层都是有序的,在网络层本人重传和组合是网络层操作的,应用层 Python 是用不到的。
字节序决定了最高位字节在字节数组的结尾还是完结,是指具体内容先传入的在右边还是在左边,右边就是结尾,这种是 big 大端。
客户端本地显示是不重要的,默认本机的能够应用 print(sys.byteorder) 打印,下面例子设置字节序 big 为大端,是标记网络缓存区 – 网卡那层传输用的。字节序只有和指标端服务端统一就行。
Tips:就是把 mtu 传入时 bytes 数据类型数据给改短用于测试。

非根底数据类型

Json 这里就不必多讲了,Json 和内存打交道和文件打交道是离开的。内存打交道 json.loads() 和 json.dumps()

def json_to_bytes(json_data: dict) -> bytes:
    """
    Json 转换字节数组
    :param json_data:  {"cat": "maomao"}
    :return: bytes
    """
    if isinstance(json_data, (str,dict)):  
        return json.dumps(json_data).encode("utf-8")

下面例子 Json 转成 bytes。

import xmltodict   #pip install xmltodict

def xml_to_bytes(xml_out_put: str)-> bytes:
    """
    xml 转换字节数组
    :param xml_out_put:
    :return:
    """
    xml_data = xmltodict.parse(xml_out_put)
    data_json = json.dumps(xml_data,ensure_ascii=False)
    data_dict = json.loads(data_json)
    if isinstance(data_dict, (str, dict)):
        return json.dumps(data_dict).encode("utf-8")

xml 这种比拟远古了,然而长处是带做个平级区域和坐标的概念。

网络编程复习

以上内容根本下面都有,练习到齐全不必查网上就能写。
1. 字符串和 bytes 和 bytearray 的练习,操作切片,同类型拼接,不满足类型转换,长度。
2. 学习大端和遍历 bytes 时的转换。
3.Json 和内存打交道二个办法,xml 局部能够顺带了解下。

本文首发于 TesterHome 社区,作者是资深游戏测试开发工程师陈子昂。用 Python 写网络编程共三篇,会陆续分享给大家[原文链接]。

以上是明天的分享,你学废了吗~

想学习更多干货常识和前沿技术?

想结识测试行业大咖和业界精英?

欢送关注 2022 年 MTSC 大会(第十届中国互联网测试开发大会)

2021 年 MTSC 大会荣获了「2021 中国最受开发者欢送技术流动」

中国互联网测试开发大会 Testing Summit China,是由 TesterHome 发动的软件测试开发行业技术会议。还有个别名:Make Testing Super Cool!

MTSC 大会以“软件品质保障体系和测试研发技术交换”为次要目标,始于 2015 年,已胜利举办了九届。共有 1000+ 家企业,10000+ 测试工程师、测试经理、CTO 参会,受到了全行业的宽泛关注,是中国互联网质量保证行业的顶级会议。


为了保障议题品质,每年都会提前半年进行议题征集,再通过初审、二审和终审,最终确定在大会分享的议题。MTSC 2022 的议题还在征集中,各位资深测试技术专家、品质治理经理和测试新秀们投递议题!

提交议题形式
间接点击 https://www.wjx.top/vj/wZwCju… 进入投递入口,依照格局进行填写并提交即可。

成为分享讲师的收益
锤炼演讲能力,加强集体品牌
取得和业内专家面对面交换的机会,博采众长, 他山之石可以攻玉。
晋升公司品牌,给本人的团队减少吸引力
获取收费的大会门票和材料:每位讲师都会获赠 1 张大会门票,大会后续的 PPT 和视频都会第一工夫给讲师分享

退出移动版