python - 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()
解决方案
推荐阅读
- fortran - 错误: (1) 处的 DATA 语句中的语法错误
- c# - 改进具有相关父 ID 的条目的递归计数
- c - 使用存储链表每个节点地址的数组查找两个singlyLinkedlist的合并点
- python - Sagemaker 使用经过处理的腌制 ndarray 而不是来自 S3 的 csv 文件
- .net-core - 如何在.net core api中传递多个实体或json作为参数
- nestjs - Nestjs Crud:过滤加入请求以仅返回当前用户的数据
- ruby-on-rails - 如何在has_many中编辑和更新连接表中的属性:通过关联?
- javascript - 我可以在 Google 表格中使用自定义 js 函数来过滤单元格函数吗
- python - 通过更多值解析字符串
- reactjs - 如何摆脱反应选择下拉菜单中的输入框