python UDP套接字客户端recevfrom非常慢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python UDP套接字客户端recevfrom非常慢相关的知识,希望对你有一定的参考价值。

我在respberrypi 3上使用python3代码。这是服务器上的代码:

import json, time, requests, signal, sys, socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
sock.bind((s.settings["udpIP"], s.settings["udpPort"]))
sessions = {}
c = 0

while True:
    data, addr = sock.recvfrom(65535)

if somedata is x:
        sequence = <clientSessionSeq> #startint at 000 and then 001 ( to monitor the udp packet so i wont lose any packets)
        sock.sendto(sequence, (addr))       # returning the client the seq i got so it may proceed sending the next one, if its not the same seq client will resend lost package
            s.print_info(
                {
                    "REMOTE_ADDRESS": addr,
                    "STATUS": "PUBLISH",
                },
            )         
            c = 0
        c = c + 1

客户代码-

data = data_iter()
while True:
        # if seq is ok then pull next data
        dataTmp = next(data)
    sock.sendto(
        "ID ".encode() + headers["SESSION_ID"].encode() + sequence + dataTmp,
        (s.settings["server"]["ip"], s.settings["udpPort"]),
    )
    try:
        sock.settimeout(3)
        response, addr = sock.recvfrom(1024)
    except IOError as  e:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        traceback.print_exception(exc_type, exc_value, exc_traceback)
        s.print_info(e)

我的问题是在response, addr = sock.recvfrom(1024)的客户端代码中,我有时会在3秒后超时,服务器向客户端发送接收到的seq,但是客户端recvfrom卡住了延迟了。

有没有办法对raspberrypi或套接字代码中的udp进行一些调整?

我不能使用tcp,我知道它会更好,我必须使用udp

如果无法删除recivefrom,它将运行良好,但是我丢失了数据包,我将其用于流式录制,因此必须获得完整的录制。我只需要调整建议或使用udp而不使用套接字的另一种方法?

谢谢。

答案

大概这不是由于UDP太“慢”所致,实际上只是丢包的一个示例。假设您说需要使用UDP,则需要自己处理。

我以为您将不得不编写与TCP中存在的代码非常相似的代码,因此,我建议您在此查找以前如何解决它。 TCP使用一种称为滑动窗口的工具来随时跟踪处于“运行中”状态的数据包的状态,并且应该有许多关于它们如何/为什么工作的现有文档。

以上是关于python UDP套接字客户端recevfrom非常慢的主要内容,如果未能解决你的问题,请参考以下文章

Python学习日志——UDP套接字使用

python基于udp的套接字

python:UDP网络程序与总结

python3套接字udp设置接受数据超时

python中的TCP及UDP

python基础-UDP进程进程池paramike模块