'How can I create a two thread one for sending video and others for receiving video at the sam time in UDP python

Hi guy I am making a UDP protocol to create a live chat between server and client I have written a code for server to send video to client and vice versa which work fine.but right now I am trying to make it to sending and receiving at the same time I tried using two thread for both client and server but seems like I am getting this error

2022-03-27 04:51:48.211 python3[6961:9402560] WARNING: nextEventMatchingMask should only be called from the Main Thread! This will throw an exception in the future.

And it is not working image

here is my code

server.py

import numpy as np
import cv2, imutils, socket
import time
import base64
import threading


BUFF_SIZE = 65536

message = b'Hello'

def create_UDP_Socket():
    global server_socket
    global host_ip
    global host_name
    global port
    
    try:

        server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, BUFF_SIZE)
        host_name = socket.gethostname()
        print(host_name)
        host_ip = socket.gethostbyname(host_name)
        print(host_ip)
        port = 9998
    except socket.error as msg:
        print(f'Create socket error : {msg}')
      
def binding_socket():
    try:
        socket_address = (host_ip, port)
        server_socket.bind(socket_address)
        print('listening at :-', socket_address)
    except socket.error as msg:
          print(f'Binding socket error : {msg}')

def broadcast():
    print('Waiting for client to connect to broadcast')
    while True:
        
        vid = cv2.VideoCapture(0)
        fps, st, frames_to_count, cnt = (0, 0, 20, 0)
        # receive request from user 
        msg, client_addr = server_socket.recvfrom(BUFF_SIZE)
        print('GOT connection from ', client_addr)
        
        # Check user request
        if msg == b'request broadcast':

            print(f'Receveing request broadcasting from client{client_addr}')
            print(f'Broadcast video to user :{client_addr}')
            Width = 400
            while vid.isOpened():
                _,frame = vid.read()
                frame = imutils.resize(frame, width=Width)
                endcoded, buffer = cv2.imencode('.jpg', frame, [cv2.IMWRITE_JPEG_QUALITY, 80])
                message = base64.b64encode(buffer)
                server_socket.sendto(message,client_addr)
            # print(f'Sending to client : {client_addr}')
                frame = cv2.putText(frame, 'FPS: ' + str(fps), (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
                cv2.imshow('Transmitting Video to Client (q:quit)',frame)
                key = cv2.waitKey(1) & 0xFF

                if key == ord('q'):
                    server_socket.close()
                    break
                if cnt == frames_to_count:
                    try:
                        fps = round(frames_to_count/(time.time()-st))
                        st=time.time()
                        cnt=0
                    except:
                        pass
                cnt+=1
        else:
            print(f'Client at address {client_addr} wrong request')
            msg = b'wrong request'
            server_socket.sendto(msg,client_addr)
            break

def receive_broadcast():

    # wating for client to send request
    print('waiting for client to connect')

    # receive connection from client
    msg, client_addr = server_socket.recvfrom(BUFF_SIZE)
    
    print(f'Connect to : {client_addr}')
    server_socket.sendto(message,client_addr)
    print('Receciving a broadcast')
      

    fps, st, frames_to_count, cnt = (0, 0, 20, 0)
    while True:
        
        # receiving video fromm client
        packet, _ = server_socket.recvfrom(BUFF_SIZE)
        data = base64.b64decode(packet,b' /')
        npdata = np.fromstring(data, dtype=np.uint8)
        frame = cv2.imdecode(npdata, 1)
        frame = cv2.putText(frame, 'FPS: ' + str(fps), (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
        cv2.imshow("RECEIVING VIDEO from Client (q:quit)", frame)
        key = cv2.waitKey(1) & 0xFF
        if key == ord('q'):
            server_socket.close()
            break
        if cnt == frames_to_count:
                try:
                    fps = round(frames_to_count/(time.time()-st))
                    st=time.time()
                    cnt=0
                except:
                    pass
        cnt+=1

def start():
    t1 = threading.Thread(target=broadcast)
    t2 = threading.Thread(target=receive_broadcast)
    t1.start()
    t2.start()
    


create_UDP_Socket()
binding_socket()

start()

client.py

import cv2, imutils, socket
import numpy as np
import time
import base64
import threading
BUFF_SIZE = 65536
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, BUFF_SIZE)
host_name = socket.gethostname()
host_ip =  socket.gethostbyname(host_name)
print('Host ip: - ',host_ip)
port = 9998


def receive_broadcast():
    #request to connect
    message =  b'request broadcast'
    client_socket.sendto(message, (host_ip, port))
    print('test: ',message)
    print('Send Request to a server for Broadcast video')
    fps, st, frames_to_count, cnt = (0, 0, 20, 0)
    while True:
        packet, server_add = client_socket.recvfrom(BUFF_SIZE)
        if packet == b'wrong request':
            print('server reject ')
            break 

        #print(f"connected to  server:{server_add}")
        data = base64.b64decode(packet,b' /')
        npdata = np.fromstring(data, dtype=np.uint8)
        frame = cv2.imdecode(npdata, 1)
        frame = cv2.putText(frame, 'FPS: ' + str(fps), (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
        cv2.imshow("RECEIVING VIDEO from Server (q:quit)", frame)
        key = cv2.waitKey(1) & 0xFF
        if key == ord('q'):
            client_socket.close()
            break
        if cnt == frames_to_count:
                try:
                    fps = round(frames_to_count/(time.time()-st))
                    st=time.time()
                    cnt=0
                except:
                    pass
        cnt+=1
    

def broadcast():

    # request to connect
    message = b'request to connect to server'
    client_socket.sendto(message, (host_ip, port))
    print('test: ',message)
    print('Sending Broadcasting')

    while True:
        vid = cv2.VideoCapture(0)
        fps, st, frames_to_count, cnt = (0, 0, 20, 0)
        msg, client_addr = client_socket.recvfrom(BUFF_SIZE)
        print('GOT connection from ', client_addr)
        Width = 400
        while vid.isOpened():
            _,frame = vid.read()
            frame = imutils.resize(frame, width=Width)
            endcoded, buffer = cv2.imencode('.jpg', frame, [cv2.IMWRITE_JPEG_QUALITY, 80])
            message = base64.b64encode(buffer)
            client_socket.sendto(message,client_addr)
            frame = cv2.putText(frame, 'FPS: ' + str(fps), (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
            cv2.imshow('Transmitting Video to Server (q:quit)',frame)
            key = cv2.waitKey(1) & 0xFF

            if key == ord('q'):
                client_socket.close()
                break
            if cnt == frames_to_count:
                try:
                    fps = round(frames_to_count/(time.time()-st))
                    st=time.time()
                    cnt=0
                except:
                    pass
            cnt+=1


def start():

    t1 = threading.Thread(target=broadcast)
    t2 = threading.Thread(target=receive_broadcast)
    t1.start()
    t2.start()

start()


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source