The UDP protocol, it can be seen from the UDP packet header, UDP is the maximum packet length of 2 ^ 16-1 bytes. Since the UDP header accounts for 8 bytes, and for the encapsulated IP header accounts for 20 bytes in the IP layer, so this is the maximum theoretical length of the UDP packet is 2 ^ 16--1--8--20 = 65507 bytes. If the data packets sent over 65,507 bytes, send or sendto function error code 1 (Operation not permitted, Message too long)
When the video resolution (width * length <65507 time)
Receiving video terminal:
CV2 Import
from Socket * Import
from Time Import the ctime, SLEEP
Import Threading
Import numpy AS NP
class ChatRoomPlus:
DEF the __init __ (Self):
# Global Parameter
self.encoding = " UTF-. 8 " encoding # used
self.recvbroadcastPort = 10101 broadcast port #
self.sendbroadcastPort = 10102
# create broadcast receiver
self.recvSocket = Socket (AF_INET, SOCK_DGRAM)
self.recvSocket.setsockopt (SOL_SOCKET, the SO_REUSEADDR, . 1 )
self.recvSocket.setsockopt (SOL_SOCKET, SO_BROADCAST is, . 1 )
self.recvSocket.bind (( '' , self.recvbroadcastPort))
# Create broadcasting transmitter
self.sendSocket = Socket (AF_INET, SOCK_DGRAM)
self.sendSocket.setsockopt (SOL_SOCKET, SO_BROADCAST, 1 )
self.sendData = None
# other
self.threads = []
DEF the send (Self):
"" " send broadcast " ""
self.sendData = " 1 "
Print ( " UDP sender successfully started ... ")
while True:
self.sendSocket.sendto(self.sendData.encode(self.encoding), ('255.255.255.255', self.sendbroadcastPort))
#print("【%s】%s:%s" % (ctime(), "我", self.sendData))
#sleep(1)
self.sendSocket.close()
def recv(self):
"""接收广播"""
print("UDP接收器启动成功...")
cv2.namedWindow('img')
while True:
# 接收数据格式:(data, (ip, port))
recvData, addr = self.recvSocket.recvfrom(400000)
recvData = np.frombuffer(recvData, dtype=np.uint8)
if recvData[0]:
imde = cv2.imdecode(recvData, 1)
print("imshow........")
cv2.imshow('img', imde)
k = cv2.waitKey(1)
if k == ord('q'):
self.sendData="0"
break
# sleep(1)
self.recvSocket.close()
cv2.destroyAllWindows()
def start(self):
"""启动线程"""
t1 = threading.Thread(target=self.recv)
t2 = threading.Thread(target=self.send)
self.threads.append(t1)
self.threads.append(t2)
for t in self.threads:
t.setDaemon(True)
t.start()
while True:
pass
if __name__ == "__main__":
demo = ChatRoomPlus()
demo.start()
Video sending end:
import cv2
from socket import *
from time import ctime, sleep
import threading
class ChatRoomPlus:
def __init__(self):
# 全局参数配置
self.encoding = "utf-8" # 使用的编码方式
self.recvbroadcastPort = 10102 # 广播端口
self.sendbroadcastPort = 10101
# 创建广播接收器
self.recvSocket = socket(AF_INET, SOCK_DGRAM)
self.recvSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
self.recvSocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
self.recvSocket.bind(('', self.recvbroadcastPort))
self.recvData=None
# 创建广播发送器
self.sendSocket = socket(AF_INET, SOCK_DGRAM)
self.sendSocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
# 其他
self.threads = []
def send(self):
"""发送广播"""
cap = cv2.VideoCapture('ex2.mp4')
# cap.set(3, 224)
# cap.set(4, 224)
print("UDP发送器启动成功...")
while True:
print(self.recvData)
if self.recvData == b'1':
ret, fra = cap.read()
if ret:
print(ret)
_, sendData = cv2.imencode('.jpg', fra)
print(sendData.size)
print(fra.size)
self.sendSocket.sendto(sendData, ('255.255.255.255', self.sendbroadcastPort))
sleep(1)
self.sendSocket.close()
cap.release()
def recv(self):
"""接收广播"""
print("UDP接收器启动成功...")
while True:
# 接收数据格式:(data, (ip, port))
self.recvData, addr = self.recvSocket.recvfrom(1024)
# print("【%s】[%s : %s] : %s" % (ctime(), self.recvData[1][0], self.recvData[1][1], self.recvData[0].decode(self.encoding)))
#sleep(1)
self.recvSocket.close()
def start(self):
"""启动线程"""
t1 = threading.Thread(target=self.recv)
t2 = threading.Thread(target=self.send)
self.threads.append(t1)
self.threads.append(t2)
for t in self.threads:
t.setDaemon(True)
t.start()
while True:
pass
if __name__ == "__main__":
demo = ChatRoomPlus()
demo.start()
参考:https://www.cnblogs.com/purpleraintear/p/6403053.html
https://bbs.csdn.net/topics/392314197?page=1
https://www.cnblogs.com/reader/p/10011666.html