Python получить все дейтаграммы UDP - PullRequest
1 голос
/ 30 мая 2020

Server.py i sh

import random
import pickle
import time
import socket
num=random.random()
data=pickle.dumps(num)
now=time.time()
mail={'d':data,'t':now}
box=pickle.dumps(mail)
UDP_IP = socket.gethostname()
UDP_PORT = 42096
place=(UDP_IP,UDP_PORT)
tube = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
tube.sendto(box, place)

import threading
randomnumstreamgo=True
def randomnumstreamloop():  #This sends a random number to 42069 every 10 seconds
    global randomnumstreamgo
    while randomnumstreamgo:
        num=random.random()
        data=pickle.dumps(num)
        now=time.time()
        mail={'d':data,'t':now}
        box=pickle.dumps(mail)
        tube.sendto(box, place)
        delay=10
        time.sleep(delay)
    randomnumstream=True

randomnumstreamloophandler=[[thread,thread.start()] for thread in [threading.Thread(target=randomnumstreamloop,args=())]][0]

Client.py i sh

import socket
UDP_IP = socket.gethostname()
UDP_PORT = 42096
place=(UDP_IP,UDP_PORT)
tube = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
tube.bind(place)

import pickle
def unbox(box):
    mail=pickle.loads(box)
    data=mail['d']
    num=pickle.loads(data)
    return num

data, addr = tube.recvfrom(1024)

fresh=0
doit=True
def thefreshest():
    data, addr = tube.recvfrom(1024)
    global fresh
    fresh=unbox(data)
    global doit
    doit=True
    #print(fresh)

thefreshest()
thefreshestgo=True
def thefreshestloop():
    global thefreshestgo
    while thefreshestgo:
        thefreshest()
    print("endingfreshestloop")
    thefreshestgo=True

import threading
thefreshestloophandler=[[thread,thread.start()] for thread in [threading.Thread(target=thefreshestloop,args=())]][0]

def fibonacci(n): 
    a = 0
    b = 1
    if n < 0: 
        print("Incorrect input") 
    elif n == 0: 
        return a 
    elif n == 1: 
        return b 
    else: 
        for i in range(2,n): 
            c = a + b 
            a = b 
            b = c 
        return b

import random
def computationallyexpensive(x):
    return str(fibonacci(250000+int(x*20000)))[::32][:1024]

grindinggo=False
grindinggo=True
def grindingloop():
    global grindinggo
    global doit
    while grindinggo:
        if doit:
            print(computationallyexpensive(fresh))
            doit=False
    print("endinggrindingloop")
    grindgo=True

grindinghandler=[[thread,thread.start()] for thread in [threading.Thread(target=grindingloop,args=())]][0]

В настоящее время я решаю эту проблему с помощью двух потоков, один поток постоянно обновление переменной freshest и другой поток, работающий с ней. Есть ли способ получить все доступные датаграммы UDP, такие как recvall () с TCP, чтобы мне не нужно было создавать отдельный поток? Я понимаю, что UDP основан на дейтаграммах, а TCP - на потоках.

...