webscoket多个客户端同时向一个服务器传输数据

同一个局域网下,服务器取图片流 发送给客户端 客户端连续展示图片(视频)

在服务器和客户端一对一的情况下,视频流可以正常传送,没有任何问题,

当服务器同时发送视频流给两个或两个以上的客户端时,服务端会出现断流情况,直接导致代码挂掉

服务端:

服务端读取摄像并传送给连接的客户端(可以多个)

import socket
import numpy as np
import urllib
import cv2 as cv
import threading
import time
import sys


cap = cv.VideoCapture(0)
cap.set(cv.CAP_PROP_FRAME_WIDTH, 300)  # 调窗口的宽度
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 300) # 调窗口的高度


def socket_service():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 防止重启后端口被占用,报错socket.error: [Errno 98] Address already in use)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        s.bind(('192.168.8.33', 9000))
        # 绑定服务端ip
        s.listen(10)
    except Exception as error:
        print(error)
        sys.exit(1)
    print('Waiting connection...')

    while True:
        conn, addr = s.accept()
        t = threading.Thread(target=deal_picture_data, args=(conn, addr))
        t.start()


def deal_picture_data(conn, addr):
    print('Accept new connection from {0}'.format(addr))
    while True:
        ret, frame = cap.read()
        # '.jpg'表示把当前图片img按照jpg格式编码,按照不同格式编码的结果不一样
        img_encode = cv.imencode('.jpg', frame)[1]
        data_encode = np.ascontiguousarray(img_encode)
        byte_encode = data_encode.tobytes()
        encode_len = str(len(str_encode))
        try:
            conn.send(str_encode)
            # 发送图片编码的字节流
        except Exception as e:
            print(e)
        time.sleep(0.1)
    conn.close()

socket_service()

客户端:

连接服务端并持续接受服务端发送的照片形成视频

import socket
import numpy as np
import cv2
import sys


def socket_client():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(('192.168.8.33', 9000))  # 连接服务端
    except socket.error as msg:
        print(msg)
        sys.exit(1)
    print('this is Client')
    while True:
        try:
            receive_encode = s.recv(77777)  # 接收的字节数 最大值 2147483647 (31位的二进制)
            nparr = np.frombuffer(receive_encode, dtype='uint8')
            img_decode = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
            cv2.imshow("Client_show", img_decode)
            cv2.waitKey(1)
        except Exception as e:
            print(e)


socket_client()

相关报错问题:

cv2.error: Unknown C++ exception from OpenCV code

两种情况:

第一:ndarray经过切片后,会出现内存不连续的情况,当不连续时,保存就会报错

第二:python 版本和 opencv 不匹配问题

使用的是 python3.9.7 和 opencv-python==4.5.1.48 可解决

国内镜像快速下载:

python -m pip install opencv-python==4.5.1.48 -i Simple Index

-i https://pypi.tuna.tsinghua.edu.cn/simple

相关推荐

  1. webscoket客户同时一个服务器传输数据

    2023-12-31 01:04:01       58 阅读
  2. socket从客户主机传输一个文件

    2023-12-31 01:04:01       55 阅读
  3. TCP服务主动客户发送数据

    2023-12-31 01:04:01       36 阅读
  4. Python实现一对WebSocket发送给指定客户

    2023-12-31 01:04:01       30 阅读
  5. 使用springboot 配置一个websocket客户

    2023-12-31 01:04:01       35 阅读
  6. python用websockets创建服务websocket创建客户

    2023-12-31 01:04:01       54 阅读
  7. 如何实现服务器主动客户推送实时数据

    2023-12-31 01:04:01       59 阅读
  8. maxwell同步mysql到kafka(一个服务器启动

    2023-12-31 01:04:01       20 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-31 01:04:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-31 01:04:01       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-31 01:04:01       82 阅读
  4. Python语言-面向对象

    2023-12-31 01:04:01       91 阅读

热门阅读

  1. PHP8使用PDO对象增删改查MySql数据库

    2023-12-31 01:04:01       56 阅读
  2. text-generation-inference使用

    2023-12-31 01:04:01       51 阅读
  3. for in 和for of 的区别(js)

    2023-12-31 01:04:01       54 阅读
  4. 第二百三十七回

    2023-12-31 01:04:01       44 阅读
  5. mysql_存储过程

    2023-12-31 01:04:01       62 阅读