python连接服务器失败_Python操作FTP时,TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 FTPIT技...

根据近日写的简单实例,进一步编写,Python连接FTP服务器的简单实例

发现,能够通过Python登陆FTP,但是却无法进行如下操作:

ftp.dir() #显示目录下所有目录信息

ftp.nlst() #获取目录下的文件

ftp.mkd(pathname) #新建远程目录

这是ftplib模块自带的方法,用于FTP操作时获取信息的,当使用它们的时候出现如下报错:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

=====================FTP客户端=====================

220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------

220-You are user number 1 of 50 allowed.

220-Local time is now 17:38. Server port: 21.

220-This is a private system - No anonymous login

220-IPv6 connections are also welcome on this server.

220 You will be disconnected after 15 minutes of inactivity.

已连接到: ftp.aixinxi.net

Traceback (most recent call last):

File "D:/workspace/PythonSpace/Spyder/Spyder_aixinxi/aixinxi_FTPlogin.py", line 139, in

main()

File "D:/workspace/PythonSpace/Spyder/Spyder_aixinxi/aixinxi_FTPlogin.py", line 118, in main

mkdir(ftp,dirpath)

File "D:/workspace/PythonSpace/Spyder/Spyder_aixinxi/aixinxi_FTPlogin.py", line 84, in mkdir

if find(ftp, dirpath):

File "D:/workspace/PythonSpace/Spyder/Spyder_aixinxi/aixinxi_FTPlogin.py", line 76, in find

ftp_f_list = ftp.nlst() #获取目录下文件、文件夹列表

File "D:\Anaconda3\lib\ftplib.py", line 559, in nlst

self.retrlines(cmd, files.append)

File "D:\Anaconda3\lib\ftplib.py", line 468, in retrlines

with self.transfercmd(cmd) as conn, \

File "D:\Anaconda3\lib\ftplib.py", line 399, in transfercmd

return self.ntransfercmd(cmd, rest)[0]

File "D:\Anaconda3\lib\ftplib.py", line 361, in ntransfercmd

source_address=self.source_address)

File "D:\Anaconda3\lib\socket.py", line 724, in create_connection

raise err

File "D:\Anaconda3\lib\socket.py", line 713, in create_connection

sock.connect(sa)

TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

主要保存信息:

TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

经过一番查询,从stackoverflow上找到了答案,Python ftplib超时

很可能是主动和被动模式之间的冲突。确保满足以下条件之一:

首先确保服务器支持PASV模式,并且您的客户端正在设置PASV模式,如果服务器不支持被动模式,则防火墙必须支持主动模式FTP传输。

文档中说到,在Python 2.1及更高版本中默认为被动模式。

在活动模式(非PASV)中,客户端发送PORT命令,告诉服务器在该端口上启动DATA连接,这需要您的防火墙知道PORT命令,以便它可以将传入的DATA连接转发给您 - 几乎没有防火墙支持这个。

在被动模式下,客户端打开DATA连接,服务器使用它(服务器在打开数据连接时是“被动”)。

如果没有使用被动模式,请执行ftp.set_pasv(True)并查看是否会产生影响。

在这里,我的需求是需要主动模式!

解决办法

在发送FTP登陆请求的代码中,加入:

ftp.set_pasv(False) # 如果被动模式由于某种原因失败,请尝试使用活动模式。

以下是我为操作FTP服务器而用Python开发的控制器的部分代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

# 连接登陆

import sys,os,ftplib,socket,hashlib

def connect():

try:

ftp = ftplib.FTP(HOST) # 实例化FTP对象

ftp.login(username, password) # 登录

ftp.set_pasv(False) # 如果被动模式由于某种原因失败,请尝试使用活动模式。

print(ftp.getwelcome())

print('已连接到: %s' % HOST)

return ftp

except (socket.error,socket.gaierror):

print("FTP登陆失败,请检查主机号、用户名、密码是否正确")

sys.exit(0)

即可解决这个问题!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值