• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于python:使用WebSocket打包传输图片和字符串信息

python 搞代码 3年前 (2022-02-20) 19次浏览 已收录 0个评论

最近须要模拟我的项目中的服务器:服务器不间断的给客户端发送图片及其字符串模式的参数,客户端接管这些信息进行解决,再将处理结果返回到服务端。

在网上找了很多socket代码,要么只能发送字符串信息不反对图片传输;要么是客户端给服务器发送图片,因为个别的逻辑是先启动服务端再启动客户端,所以单纯的把发图的主体改成服务端也怪怪的,因为那样只能先启动客户端。

最初抉择了第二种,竣工之后并不是很甘心,一是须要先启动客户端再启动服务端,感觉顺当;二是感觉代码有点臃肿,看起来不难看。

​不甘心,在一番周折下,我终于找到了python的WebSocket办法(之前只晓得Java有WebSocket),代码要比socket简洁很多,第一眼便爱上了。尽管这份代码也是只能传输简略的字符串,然而我违心在下面改!

​我改变的思路比拟清晰,就是将图片压缩,转化成能够在网络上高效传输的格局。两头是挺麻烦的,格局来回倒腾。这里次要借助了一个博客,非常感谢。

最初确定的转化计划为:

  • 编码阶段(server):numpy -> bytes -> base64 -> string(utf8) -> dict -> json
  • 解码阶段(client): json -> dict -> base64 -> bytes -> numpy

对于将视频帧和其余字符串信息(比方图片的名字和大小)打包传输,我是用到的下面的字典dict。
其余的就是之前提到的那份代码的框架,demo能够查阅之前的文章【应用WebSocket进行通信的繁难Demo】


server.py

import asyncio
import websockets
import time
import cv2
from sys import argv
from base64 import b64encode
from json import dumps

      
# 将numpy格局的图片和其它字符串信息打包成json在网络上传输        
def make_json(image_bytes_data,image_name):

    # # 这两行代码能够间接读取二进制图片,取得bytes字节码,留神 'rb'
    # jpg_file = open(path, 'rb') 
    # byte_content = jpg_file.read()

    
    # 把 矩阵模式的numpy 图像转化为 bytes 字节码 图片
    _,encoded_image = cv2.imencode(".jpg",image_bytes_data)
    image_bytes_data = encoded_image.tobytes()



    # 把原始字节码bytes编码成 base64 字节码
    base64_bytes = b64encode(image_bytes_data)


    # 将 base64 字节码解码成 utf-8 格局的字符串
    base64_string = base64_bytes.decode('utf-8')



    # 用字典的模式保留数据
    dict_data = {}
    dict_data["image_name"] = image_name
    dict_data["image_base64_string"] = base64_string
 


    # 将字典变成 json 格局,缩进为 2 个空格
    json_data = dumps(dict_data, indent=2)
    return json_data




async def echo(websocket, path):
    video_path = 'D:/test/ccc/mp4/1.mp4' #视频门路
  
    cap = cv2.VideoCapture(video_path) # 读取视频
    fps = cap.get(cv2.CAP_PROP_FPS)    # 获取视频的帧率

    while True:
        k=0
        while cap.isOpened():
            success, frame = cap.read()
            if success:
                k += 1
                if k % (fps*2) == 0: # 每隔2s发送一帧图片

                    data = make_json(frame, str(k)+'.jpg')
                    await websocket.send(data)      # 发送音讯
                    print('已胜利发送%3d.jpg, 睡眠2秒'%k)
                    await asyncio.sleep(2)          # 休眠2秒
        cap.release()
                    
      
if __name__ == '__main__':
    start_server = websockets.serve(echo,'127.0.0.1',6666) # 改为你本人的地址
    asyncio.get_event_loop().run_until_complete(start_server)
    asyncio.get_event_loop().run_forever()

client.py

import base64
import json
import asyncio
import websockets
import json
import numpy as np
import cv2



# 解析接管到的json数据包,将图片复原成numpy格局保留到本地
def get_json(json_data):

    dict_data = json.loads(json_data)  # 将json还原成dict


    # 从字典中获得字符串模式的相干图片信息
    image_name = dict_data['image_name']
    image_base64_string = dict_data['image_base64_string']
    

    # 将 base64 字符串解码成图片字节码bytes
    image_bytes_data = base64.b64decode(image_base64_string)


    # # 上面这两行,能够间接将字节码bytes格局的图片以二进制模式保留到本地,留神 'wb'   。 
    #   但numpy格局的图片更风行,还是想转化为numpy格局
    # with open('./new.jpg', 'wb') as jpg_file:
    #     jpg_file.write(image_bytes_data)



    # 将 图片字节码bytes  转换成一维的numpy数组 到缓存中
    image_buffer_numpy_data = np.frombuffer(image_bytes_data, dtype=np.uint8) # numpy array
    # 从指定的内存缓存中读取一维numpy数据,并把数据转换(解码)成图像矩阵格局
    image_numpy_data = cv2.imdecode(image_buffer_numpy_data, 1) 
  
    return image_numpy_data,image_name



 
 
async def hello(uri):
    async with websockets.connect(uri) as websocket:
        while True:
            json_data = await websocket.recv()  # 接管音讯
            img, name = get_json(json_data)     # 转化格局
            print('已胜利接管',name)
            cv2.imwrite('./save/'+name,img)     # 依据图片信息来保留图片
         
 

if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(
        hello('ws://127.0.0.1:6666')) # 改为你本人的地址

先运行server.py,再运行client.py,成果:

参考:
https://websockets.readthedoc…
https://www.cnblogs.com/zhumi…


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于python:使用WebSocket打包传输图片和字符串信息

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址