赞
踩
PS:先开标题,提醒自己写
记录一下最近做的一个项目遇到的问题,踩坑过来:
项目背景:需要在fastapi服务器下,搭建一个socket服务,接收BBU的数据。
所以在fastapi服务器下,环境为python
BBU 侧socket主要作为client,用C++实现
这样在同一个可通的网段下,可以实现服务器与bbu的信息传输。
踩坑历程:由于刚开始在等待BBU侧C++环境,所以自己先用python把server和client一起搭建了尝试先把功能实现。
于是历程如下:
python_server - python_client -> python_server - c++_client
先讲讲python的双工通信部分遇到的问题:
1. python线程类返回数据
(在搭建server的时候,需要开两个线程,一个线程用于接收client的实时数据,另一个线程用于给client发送数据。在后面的开发中,又加了一个能监听client连接的线程。)
由于client的数据需要返回用于计算数值,最开始写的自定义的线程类,因为在fastapi服务器上,是真的不好返回。这里参考了python线程类中返回值的方法,随便挂个链接吧:click this
这里参考了第一种方法,确实可以实现的。但有时候会返回为空,这一点可能和fastapi异步的有关。
2. fastapi 异步解决1的问题
后面在学习的过程中,发现fastapi的异步是真好用,直接写个函数如下,这样返回是真简洁。
async def getClientInfo():
....
#接收client数据
while True:
a = recv(1024) #接收,简写 非实际代码,主要是逻辑
if info收齐了就退出:
info = info + a
break
return Info
@app.post("/Client")
async def responce(..):
...
Info = await getClientInfo()
...
3.发送与接收C++数据
百度了一大波,看主要都是说编码解码,最好是ascii码什么的,但以上方法我均试过,无论是GBK还是UTF-8什么的。虽然是C++侧能收到“正确”的数据,但都是字符串。由于C++需要预先分配内存,例如Server给Client发送 “8imserver”,第一个想给C指示长度便于分配内存,后面为数据。C++收到的也确实是你发的,但其实是字符串,会变成ascii码。也就是8会对应成56(ascii表)。
正解:打包成字节流,利用Struct.pack对应C++中的数据类型打包发送。
这里放参考链接:参考链接
虽然写的是C的,C++也同样适用。
同样接收C++数据的时候,需要利用unpack
注意点:无论是发送还是接收字节流,都需要一个长度指示,才能知道到哪里为止。
example:
from Struct import *
#正解
pack('h9s', 9, b'HeartBeat')
unpack('h9s',a)
#错解 没有9,打包不完整:
pack('hs', 9, b'HeartBeat')
unpack('hs',a)
那么,解包的时候如何知道是9还是多少呢?不可能用眼睛读吧?
所以正常的情况,这是需要知道的,比如长度放在头部,那么就应该先把长度拿到,
So:
len = unpack('h', a[0:2]) #h 为short,两个字节 返回是tuple
len, = unpack('h', a[0:2]) #返回int
#得到长度后,就可以去解数据了
data, = unpack('%ss' % len, a[2:]) #格式化
以上就是此次遇到的一些问题,表示有学习到了~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。