No.3 python socketserver 搭建一个TCP server(三)客户端开发

632 阅读2分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

由于不可言的原因,完整项目代码放在

paste.ubuntu.com/p/Sn5wR3NGR…

由于Qt那边的测试应用还没给到我,只能先用python写一个客户端,测试着,顺便学习一下python怎么写TCP 客户端。

client = MammothClient()
client.connect('127.0.0.1', 8888)
while True:
    cmd = input('>>>: ').strip()

首先建立一个连接,指定ip和端口,测试的时候,用while True支持发送多条数据,用input阻塞程序,接收到输入的时候,再发送数据给服务端。

head = MsgHeader(614, len(body_data))
res = client.request(615, head.encode(), body_data.encode())

因为有可能要发送的数据很大,并且服务端已经做过了切片接收数据的处理,这里需要先new一个请求头,请求头中encode了body的长度,就成功对接上了服务端的切片接收逻辑。 由于客户端的请求比较多,于是我写了一个请求的Class,MammothClient。里面写了一些方法, connect,reconnect,disconnect,send_all_data,等等,实现了连接,重连,断开连接,发送数据等功能。

接下来讲一下发送数据以及接收逻辑。 首先在request中,调用了self.send_all_data(head_data, body_data) ,在send_all_data中,和之前服务端的操作一样。

self.sock.sendall(head_data)
# 先发个head过去,告知大小,然后循环发body
for i in range(len(body_data) // 2048 + 1):
    time.sleep(2)
    print('第 {} 次发送body数据'.format(str(i)))

首先把请求头发送到服务端,然后直接切片发送请求体,在循环完成后,服务端已经成功接收到了完整的数据,接下来客户端等待服务端处理数据完成,返回处理后的结果,这次轮到客户端分次接收数据了。

等待自己需要的response_code,在接收到这个response_code的请求头时,对请求头进行解码,解码后客户端就知道了服务端这次任务完成后,需要返回的请求体长度是多少。仍然调用相同的_receive_exact_bytes方法,来接收准确的请求体,至此,一次完整的请求流程完成。

额外的,

head.flags & MsgFlags.COMPRESSED != 0:
# 如果 head.flags 为 1  则是zlib压缩后的, 需要解压缩

如果数据过大,还可以用zlib对其进行压缩,在创建请求头的时候,把flag设置成1,拿到数据的时候解压一下就好了,减小了传输的数据量。

至此TCPserver初步开发完成,接下来还需要写登录,广播相关操作,写完再更。