gpt4 book ai didi

python - 如何检测 UDP 套接字的关闭客户端?

转载 作者:行者123 更新时间:2023-12-05 05:50:40 27 4
gpt4 key购买 nike

我正在通过以太网将一些实时数据从相机传输到客户端,我正在使用 python 套接字和 opencv 传输图像。它工作正常,我可以在客户端阅读视频。

问题是,当我启动服务器来监听需要提要的用户并启动套接字流时,然后在我关闭客户端的连接后,服务器端继续传输数据。此外,在关闭客户端连接后,我只能通过重新启动服务器来重新连接。

我已经实现了一种心跳协议(protocol),方法是每接收到第 100 张图像就从客户端向服务器发送一条消息,以告知我仍在收听 - 如果未收到,则返回循环以收听新连接。唯一的问题是 recvfrom 是非阻塞的,因此直接实现 while 循环可能行不通。

我如何检测到客户端不再读取数据?

这是我的服务器端:

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

BUFF_SIZE = 65536
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()

host_ip = 'xxx.xxx.xxx.xxx'
port = 4001
socket_address = (host_ip, port)
server_socket.bind(socket_address)
print("listening at", socket_address)

vid = cv2.VideoCapture(0)
WIDTH=480

while True:
msg,client_addr = server_socket.recvfrom(BUFF_SIZE)
print(client_addr)
while (vid.isOpened()):
print("sending img")
_,frame = vid.read()
frame = imutils.resize(frame,width=WIDTH)
encoded,buffer = cv2.imencode(".jpg",frame,[cv2.IMWRITE_JPEG_QUALITY,80])
message = base64.b64encode(buffer)
print(len(message))
server_socket.sendto(message,client_addr)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
server_socket.close()

这是我的客户端:

def video_socket_stream_client():

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 = 'xxx.xxx.xxx.xxx'
port = 4001

client_socket.sendto("connect".encode(),(host_ip, port)) # send signal



while True:

packet,_ = client_socket.recvfrom(BUFF_SIZE)
data = base64.b64decode(packet,' /')
npdata = np.frombuffer(data,dtype=np.uint8)
frame = cv2.imdecode(npdata,1)
time.sleep(0.016)
yield(b'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + data + b'\r\n')

最佳答案

这是 UDP 与 TCP 的权衡之一。使用 UDP,没有长期连接。发件人只是爆破数据,希望有人在听。听众只是拿起电话,希望有人在说话。没有持久状态。如果发件人停止发送,收听者将听不到任何声音。如果需要保持连接,则需要使用 TCP。

您永远不必重新启动服务器。双方都不知道对方在做什么。我想知道您是否因为不使用 SO_REUSEADDR 而感到厌烦。

关于python - 如何检测 UDP 套接字的关闭客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70490964/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com