Fastapi服务器上 python与C++ socket的通信传输实现

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:]) #格式化

以上就是此次遇到的一些问题,表示有学习到了~

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值