Python UDP 文件传输

问题描述 投票:0回答:1

我正在使用 python 与客户端(从服务器请求文件)、服务器(从客户端接收请求并将其传递给相关工作人员)和worker1/worker2(从服务器接收请求,如果文件存在,发送到服务器以传回客户端)并且全部运行在具有 ubuntu 映像的 docker 容器中*

目前,当我在客户端容器中输入所需文件的名称时,没有任何效果。我认为文件名实际上并未发送到服务器,但我根本不明白为什么。我想知道是否有人能发现我的错误?

服务器:

from fileinput import filename
import socket
import time


localIP     = "127.0.0.1"
localPort   = 50001
bufSize     = 1024

msg = "Server is connecting..."
print(msg)
workerAddressPorts = [('127.0.0.1', 50002), ('127.0.0.1', 50003)]
# Create datagram sockets and bind to address and ip
UDPServerSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
UDPServerSocket.bind((localIP, localPort))
print("Server is waiting for packet...")

while True:
    bytesAddressPair = UDPServerSocket.recvfrom(bufSize)
    clientBuf = bytesAddressPair[0]
    clientAddr = bytesAddressPair[1]
    msgFrom = 'Message from Client:{}'.format(clientBuf.decode('utf-8'))
    print(msgFrom)
    for workerAddressPort in workerAddressPorts:
        UDPServerSocket.sendto(clientBuf, workerAddressPort)    # send file name to worker
        print(f'Clients request has been sent to Worker {workerAddressPort[0]}')
        workerBuf = UDPServerSocket.recvfrom(bufSize)[0]     # saving data from worker
        print(f'Request recieved.')
        UDPServerSocket.sendto(workerBuf, clientAddr)    # sending data to client
        print('Packet from Worker has been sent to Client')
        while not workerBuf:                                    # split file to prevent buffer overflow
            workerBuf = UDPServerSocket.recvfrom(bufSize)[0]
            print(f'Packet received.')
            UDPServerSocket.sendto(workerBuf, clientAddr)
            print('Packet from worker has been sent to Client')
    print('File has been sent to Client.')

客户:

import sys

msgFrom = input('Name of file: ')
print(msgFrom)
bytesToSend = str.encode(msgFrom, 'utf-8')
serverAddressPort = ("127.0.0.1", 50001)
bufSize = 1024

# create UDP Client Socket and send to server
UDPClientSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
UDPClientSocket.sendto(bytesToSend, serverAddressPort)

while (True):
    try:
        serverBuf = UDPClientSocket.recvfrom(bufSize)[0]
        if len(serverBuf) > 0:
            print('Packet incoming...')
            msg = serverBuf.decode('utf-8')
        if msg == 'NO_FILE':
            print('No such file exists.')
            break
        elif msg == 'END_OF_FILE':
            print('Empty file.')
            break
        else:
            f = open(msgFrom, 'wb')
            f.write(serverBuf)
            f.close()
    except Exception as e:
        print(e)

工人:

import socket
import time
from os.path import exists

bufSize = 1024
msg = "Worker is connecting..."
print(msg)
serverAddressPort = ("127.0.0.1", 50001)

# Create a datagram socket and bind to address and ip
UDPWorkerSocket = socket.socket(family=socket.AF_INET, type=socket.SOCK_DGRAM)
UDPWorkerSocket.bind(('127.0.0.1', 50002))

print("Worker is connected and waiting...")

while True:
    time.sleep(1)
    bytesAddressPair = UDPWorkerSocket.recvfrom(bufSize)
    msg = bytesAddressPair[0]
    addr = bytesAddressPair[1]
    print('Packet Incoming...')

    file_name = msg.decode('utf-8')
    script_dir = os.path.dirname("C:/Users/Vic/Documents/3rd Year TCD/CSU33031 Computer Networks/Assignments/Assignment1.3/Files to send")
    abs_file_path = os.path.join(script_dir, file_name)

    if exists(file_name):
        f = open(file_name, 'rb')
        data = f.read(bufSize)
        while data:
            if UDPWorkerSocket.sendto(data, serverAddressPort):
                data = f.read(bufSize)
                time.sleep(1)
            print('Sent to Server.')
    else:
        UDPWorkerSocket.sendto(str.encode('NO_FILE'), serverAddressPort)
        print(f'{file_name} was not found. Moving to next available worker..')

希望服务器中的 for 语句能够迭代两个工作文件(仅包含一个),这样如果在一个工作文件中找不到该文件,就会移动到另一个工作文件

*客户端与两个工作人员连接到不同的网络。服务器已连接到两个网络

提前致谢!

python python-3.x sockets udp udpclient
1个回答
0
投票

你有没有弄清楚这一点? 我正在尝试做同样的事情并遇到同样的问题

© www.soinside.com 2019 - 2024. All rights reserved.