友友们,我通过socket建立了树莓派(服务器)和计算机(客户端)之间的通信,想实现一个功能,当计算机接收到树莓派消息时,显示一行标题并输出帧图像,若未接收到,仅输出帧图像,请问如何实现?recv函数好像会一直等待接收计算机的消息,程序会卡在这里。设置settimeout又会退出程序,有没有什么好的方法呢?
望采纳!!
你可以创建一个线程来不断地从服务器端接收消息,另一个线程则负责不断地输出帧图像。这样,你就可以同时实现输出帧图像和接收消息的功能,而不会导致程序卡在 recv 函数中。
在 Python 中,你可以使用 threading 模块来创建多线程。例如:
import threading
def receive_message(sock):
while True:
message = sock.recv(1024)
if message:
print("Received message:", message)
def display_frame(sock):
while True:
# 输出帧图像的代码
pass
# 创建两个线程
thread1 = threading.Thread(target=receive_message, args=(sock,))
thread2 = threading.Thread(target=display_frame, args=(sock,))
# 启动线程
thread1.start()
thread2.start()
上面的代码中,我们创建了两个线程:一个线程用于接收消息,另一个线程用于输出帧图像。然后我们启动这两个线程,这样就可以同时实现接收消息和输出帧图像的功能。
可以将 settimeout() 设置成一个较小的值,比如 0.01,然后在 recv() 函数调用时进行异常处理。如果出现超时错误,就说明没有收到消息,可以继续循环,输出帧图像。如果没有出现超时错误,就说明收到了消息,然后就可以将标题添加到图像中,并输出帧图像。
下面是一个例子:
import socket
import cv2
# 创建套接字
mySocket = socket.socket()
# 设置超时时间
mySocket.settimeout(0.01)
# 连接到服务器
mySocket.connect(('树莓派的IP地址', 端口号))
# 创建视频写入器
videoWriter = cv2.VideoWriter('输出视频的文件名', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 20, (640, 480))
# 创建视频捕获器
cap = cv2.VideoCapture(0)
while True:
# 读取帧图像
ret, frame = cap.read()
if not ret:
break
try:
# 接收消息
rev = mySocket.recv(1024)
if rev:
# 将标题添加到图像中
frame = add.cv2Im
仅供参考,望采纳,谢谢。