1

我和我的朋友已经开展了一个小项目作为我们夏季的计划,我们试图使用 python 的 FTP 作为项目的一部分。我们可以通过同一网络成功传输文件,但我们不知道当我们通过互联网(通过不同的网络)连接时如何传输文件。我已添加代码供您参考。我是 FTP 和 python 的新手,如果有人可以帮助我们,那就太好了。

服务器端程序:

 #server.py

 from pyftpdlib.ftpserver import DummyAuthorizer
 from pyftpdlib.ftpserver import FTPHandler
 from pyftpdlib.ftpserver import FTPServer

 authorizer = DummyAuthorizer()
 authorizer.add_user("user", "12345", "/", perm="elradfmw")
 authorizer.add_anonymous("/")
 handler = FTPHandler
 handler.authorizer = authorizer
 server = FTPServer(("xxx.xxx.x.x", 2121), handler)
 server.serve_forever()

和客户端程序:

 #client.py
 import ftplib

 fileTransfer = ftplib.FTP()
 fileTransfer.connect("xxx.xxx.x.x",2121)
 fileTransfer.login('user','12345')
 fileTransfer.retrlines('LIST')
 fileTransfer.cwd('/home/royal/MyPrograms/Python')
 fileTransfer.retrbinary('RETR  Florida.mp3',open('club.mp3','wb').write)

我在 NAT 后面工作。

4

2 回答 2

4

您可能遇到了防火墙问题;使用被动模式 FTP应该会有所帮助。该链接有一个很好的解释,但简短的版本是,默认情况下,FTP 使用“主动”模式,客户端创建与服务器的连接以发出请求,然后服务器创建与客户端的连接以响应. 大多数防火墙都配置为阻止“自发”入站连接,除非防火墙专门配置为查看来自客户端的出站连接的内容并看到“啊哈,一个 FTP 请求,我应该期待来自该服务器的传入连接很快”,它将阻止连接。

另一方面,被动模式让客户端创建两个出站连接,一个用于请求,另一个(在不同的、随机选择的端口上)服务器将用于发送响应。现成的路由器+防火墙解决方案,在其默认配置中,将允许所有出站连接通过,因此这将使客户端的防火墙允许连接通过。但是,在服务器端配置防火墙会更难,因为数据的传入连接可以在任何端口上——除非您缩小被动数据端口范围。

所以你应该做的是:

  • 使用被动模式。
  • 将服务器配置为接受特定范围的端口(例如,34500 到 34510,以随机选择数字 - 它不需要很大的范围)用于其被动数据传输
  • 在服务器端配置防火墙以允许该端口范围以及“正常”FTP端口(在您的情况下为2121)上的传入连接

如果您遇到的问题是防火墙问题,那么它应该适合您。如果它仍然不起作用;您可能还有其他问题,所以请继续提出新问题!(或者如果它明显与防火墙问题有关,则更新它)。

于 2013-06-29T17:17:51.993 回答
1

我认为您的问题的解决方案是端口转发

portforwarding.com

于 2013-06-29T17:47:25.507 回答