2013-06-29 24 views
1

我和我的朋友已经承担了一个小项目作为我们今年夏天的计划,并且我们试图使用python作为项目的一部分。我们可以通过同一网络成功传输文件,但我们不知道如何在通过互联网连接时(通过不同的网络)传输文件。我已经添加了代码供您参考。我对FTP和python都是新手,如果有人能帮助我们,那将会很棒。在python中通过不同网络的FTP

服务器端程序:

#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

你是NAT /网关后面? – kamjagin

+0

@ kamjagin,是的。 :) – Denzil

+0

太棒了,那么rmunn的答案可能会做的伎俩:) – kamjagin

回答

4

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

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

所以,你应该做的是:

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

如果您遇到的问题是防火墙问题,应该使它适合你。如果它还没有工作;你可能有另一个问题,所以继续问一个新的问题! (或者更新这一个,如果是明确与防火墙问题有关)。

1

我觉得你的问题的解决方案是端口转发

portforwarding.com

+0

这真的没有足够的细节有助于原来的海报。他应该转发哪些端口?当他尝试使用端口转发时,他遇到什么FTP特定的问题?只是说“解决方案是端口转发”并不能帮助他。 – rmunn