首页 > 解决方案 > Python:如何通过UDP同时接收来自多个客户端的二进制数据?

问题描述

我有一个简单的 UDP 客户端-服务器程序,它有两个文件 - sender.py 和 listener.py。sender.py 只是在 listener.py 接收到二进制数据并将其保存在计算机上时发送文件。这工作正常,多个客户端可以连接到服务器并一次发送一个文件。问题是服务器无法同时接收来自多个客户端的数据。当我尝试同时从多个客户端发送文件时 - 仅从一个客户端处理数据。

你能告诉我如何设置一个 UDP 服务器来同时存储来自多个客户端的二进制数据吗?

监听器.py

import os

buf = 1024

host = input('enter ip address: ')
port = int(input('enter port number: '))

address = (host, port)

# create a UDP socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# allow multiple sockets to use the same PORT number
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Bind the ip and port number
s.bind((host, port))


def listen():
    while True:
        file = None
        try:
            data, addr = s.recvfrom(buf)
            print(f'server received data from: {addr}')

            file = open('test.wav', 'wb')

            while data:
                file.write(data)
                s.settimeout(2)
                data, addr = s.recvfrom(buf)
        except socket.timeout:
            if file is not None:
                file.close()


listen()

发件人.py


buf = 1024

host = input('enter ip address: ')
port = int(input('enter port number: '))

address = (host, port)

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, 0))
s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 255)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)


def send_file():
    file_name = input('insert path to a file: ')
    f = open(file_name, "rb")
    data = f.read(buf)

    print("sending data...")
    while data:
        if s.sendto(data, address):
            data = f.read(buf)

    f.close()


send_file()

while True:
    if input('Exit? (y/n)') == 'y':
        s.close()
        break
    send_file()

标签: pythonsocketsudp

解决方案


推荐阅读