当前位置:   article > 正文

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

python fastapi 实时传递

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()
...

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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)  

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

那么,解包的时候如何知道是9还是多少呢?不可能用眼睛读吧?
所以正常的情况,这是需要知道的,比如长度放在头部,那么就应该先把长度拿到,
So:

	len = unpack('h', a[0:2]) #h 为short,两个字节 返回是tuple
	len, = unpack('h', a[0:2]) #返回int
	#得到长度后,就可以去解数据了
	data, = unpack('%ss' % len, a[2:]) #格式化
  • 1
  • 2
  • 3
  • 4

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/863433
推荐阅读
相关标签
  

闽ICP备14008679号