【问题标题】:UDP File Transfer PythonUDP 文件传输 Python
【发布时间】:2022-01-08 20:25:16
【问题描述】:

我最近开始学习套接字编程。我正在尝试编写一个 python 程序来将文件从服务器传输到客户端。我已经编写了以下代码。它运行得很好......但我没有在客户端获取文件(可能没有发生传输)。

这是服务器端代码:

import socket

host = "127.0.0.1"
port = 12000
buffer_size = 1024
file_name = 'Myfile.txt'

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((host,port))

sock.sendto(file_name.encode(),(host,port))

f = open(file_name, "r")
data = f.read(buffer_size)
while data:
  print(data)
  if(sock.sendto(data.encode(), (host, port))):
    data = f.read(buffer_size)

sock.close()
f.close()

这是客户端代码:

import socket

host = "127.0.0.1"
port = 12000

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((host,port))

f= open('Myfile2.txt','wb')
print('New file created')

while True:
  data, addr = sock.recvfrom(1024)
  print(data)
  while(data):
    f.write(data.decode("utf-8"))
    data, addr = sock.recvfrom(1024)
    
  print('File is successfully received!!!')
  f.close()
  f = open('Myfile2.txt','r')
  print(f.read)
    
  f.close()
  sock.close()
  print('Connection closed!')

谁能帮我找出代码中的问题?提前谢谢!!!

【问题讨论】:

标签: python sockets udp file-transfer


【解决方案1】:

您的代码可以有很多改进。

首先,创建您要接收文件的服务器,以便您可以保持它运行并仅在此处绑定端口,而不是在客户端。此外,您使用的 while 循环是错误的,因为您永远无法摆脱它。

服务器代码:


import socket

host = "127.0.0.1"
port = 12000

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((host,port))

f= open('Myfile2.txt','wb')
print('New file created')
data, addr = sock.recvfrom(1024)

while data:
    print(data)
    if data.decode("utf-8")=="Now":
        break
    f.write(data)
    data, addr = sock.recvfrom(1024)

print('File is successfully received!!!')
f.close()
f = open('Myfile2.txt','r')
print(f.read)

f.close()
sock.close()
print('Connection closed!')

客户端代码:


import socket

host = "127.0.0.1"
port = 12000
buffer_size = 1024
file_name = 'Myfile.txt'

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

f = open(file_name, "r")
data = f.read(buffer_size)

while data:
    print(data)
    if(sock.sendto(str.encode(data), (host, port))):
        data = f.read(buffer_size)
sock.sendto(str.encode("Now"),(host, port))
sock.close()
f.close()

注意:我发送Now只是为了让服务器知道文件已完成,您可以发送任何其他内容。

【讨论】:

  • 非常感谢您指出我的问题。但是,我试图将文件从服务器发送到客户端。
  • 为此,您可以使用相同的代码(将交换发送和接收命令),但您需要确保只有在您的客户端和服务器都连接后,您才会发送数据包,否则代码将不起作用。
  • 知道了。感谢您一直以来的支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
相关资源
最近更新 更多