我和我的朋友已经承担了一个小项目作为我们夏天的计划,我们正在尝试使用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后面工作。
答案 0 :(得分:4)
您可能遇到了防火墙问题;使用passive mode FTP应该有所帮助。在该链接上有一个很好的解释,但简短版本是默认情况下FTP使用“活动”模式,其中客户端创建与服务器的连接以发出请求,然后服务器创建 new 连接到客户端进行响应。大多数防火墙都配置为阻止“自发”入站连接,除非防火墙专门配置为从客户端查看出站连接的内容并看到“啊哈,一个FTP请求,我应该期待来自该服务器的传入连接很快“,它将阻止连接。
另一方面,被动模式让客户端创建两个出站连接,一个用于请求,另一个用于(在不同的,随机选择的端口上)服务器将用于发送响应。现成的路由器+防火墙解决方案,在其默认配置中,将允许所有出站连接通过,因此这将使客户端的防火墙通过连接。但是,在服务器端配置防火墙会更难,因为数据的传入连接可能在任何端口上 - 除非您缩小被动数据端口范围。
所以你应该做的是:
如果您遇到的问题是防火墙问题,那么它应该适合您。如果它还没有工作;你可能有另一个问题,所以继续问一个新问题! (或者,如果明确与防火墙问题相关,请更新此项。)
答案 1 :(得分:1)
我认为您的问题的解决方案是端口转发