关于服务器:WebSocket实现从服务器向客户端发送图片和字串串消息

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

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

最初抉择了第二种,竣工之后并不是很甘心,次要是须要先启动客户端再启动服务端,感觉顺当。【实现】。

不甘心,在一番周折下,终于找到了python的WebSocket办法(之前只晓得Java有WebSocket),代码要比socket简洁一些,并且容许服务端被动向客户端发送数据,正适宜我的需要。尽管这份代码也是只能传输简略的字符串,但我很违心在下面改。

WebSocket 是一种在单个 TCP 连贯上进行全双工通信的协定。WebSocket 使得客户端和服务器之间的数据交换变得更加简略,容许服务端被动向客户端推送数据

socket是比拟底层的接口,只能传输bytes格局的数据。然而WebSocket`是应用层协定,能够传输其余格局的数据(其实到底层之后同样要解析成bytes),比方json。但我除去传输图片同时还要传输字符串,用json的话要么打包成一个字典再转化为json,要么发送两个json,感觉会很倒腾,还不如就间接传两个bytes。

numpy图片string字符串转化为bytes字节流的办法,还是参考上一篇文章。


server.py

import asyncio
import websockets
import cv2

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*4) == 0: # 每隔4s发送一帧图片
                    # 将numpy图片转化为bytes字节流
                    _, img_encode = cv2.imencode('.jpg', frame)
                    img_data = img_encode.tobytes()

                    # 将string字符串转化为bytes字节流
                    img_name = (str(k)+'.jpg').encode()

                    # 间断发送音讯
                    await websocket.send(img_data)    
                    await websocket.send(img_name)  
                    print('已胜利发送%3d.jpg,睡眠1秒'%k)
                    await asyncio.sleep(1)          # 休眠1秒
        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 asyncio
import websockets
import numpy as np
import cv2
import os


async def hello(uri):
    async with websockets.connect(uri) as websocket:
        os.makedirs('./save',exist_ok=True)
        while True:
            img_data = await websocket.recv()  # 接管音讯
            img_name = await websocket.recv()  # 接管音讯

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

            name = img_name.decode()
            cv2.imwrite('./save/'+name, frame)   
            print('已胜利接管',name)
          

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

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理