UDP recv 给出此错误... 'tuple'对象没有属性'recvfrom'



我正在使用PyCharm。我正在尝试制作一个UDP客户端/服务器,客户端向服务器发送一些视频(摄像头网络(,服务器打印它。

当试图在常规模式下运行代码时,我得到了以下错误:

"元组"对象没有属性"recvfrom">

但在使用调试模式时,一切都很好。

客户端代码:

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

HOST = '192.168.56.1'
PORT = 9999
ADDR = (HOST, PORT)
BUFF_SIZE = 65536

def send_vid(client_socket):
vid = cv2.VideoCapture(0)  # replace 'rocket.mp4' with 0 for webcam
WIDTH = 400
while(vid.isOpened()):
ret, frame = vid.read()
frame = imutils.resize(frame, width=WIDTH)
encoded, buffer = cv2.imencode('.jpg', frame, [cv2.IMWRITE_JPEG_QUALITY, 80])
message = base64.b64encode(buffer)
client_socket.sendto(message, ADDR)
cv2.imshow('SENDING VID', frame) #change if only sends
if cv2.waitKey(1) & 0xFF == ord('q'):
client_socket.sendto("+DISCONNECT".encode("utf-8"), ADDR)
client_socket.close()
break

if __name__ == '__main__':
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, BUFF_SIZE)
client_socket.sendto(b'hello', ADDR)
print(f"[CONNECTED] : connected to {ADDR}")
t1 = threading.Thread(target=send_vid, args={client_socket})
t1.start()

服务器代码:

import cv2, imutils, socket
import numpy as np
import time
import base64
import threading
HOST = '192.168.56.1'
PORT = 9999
ADDR = (HOST, PORT)
BUFF_SIZE = 65536

def recv_vid(server_socket, client_addr):
while True:
try:
packet, _ = server_socket.recvfrom(BUFF_SIZE)#<------------- this is where the error
data = base64.b64decode(packet, ' /')
npdata = np.fromstring(data, dtype=np.uint8)
frame = cv2.imdecode(npdata, 1)
cv2.imshow("RECEIVING VIDEO", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
except Exception as e:
print(e)
#print(f"[DISCONNECT] : {client_addr} disconnected")

if __name__ == '__main__':
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, BUFF_SIZE)
server_socket.bind(ADDR)
print(f"[SERVER INIT] : server is ready {ADDR}")
WIDTH = 400
while True:
msg, client_addr = server_socket.recvfrom(BUFF_SIZE)
if msg == b'hello':
print(f'[NEW CONNECTION] : {client_addr}')
t1 = threading.Thread(target=recv_vid, args={server_socket, client_addr})
t1.start()

我不是Python专家,但我能找到的threading.Thread的几乎每个例子都使用括号将参数传递给线程函数。但是您使用的是大括号

试试这个:

将:
t1 = threading.Thread(target=send_vid, args={client_socket})
更改为:
t1 = threading.Thread(target=send_vid, args=(client_socket,))

将:
t1 = threading.Thread(target=recv_vid, args={server_socket, client_addr})
更改为:
t1 = threading.Thread(target=recv_vid, args=(server_socket, client_addr))

最新更新