python网络编程学习笔记
多用途客户端协议
一、ftp
功能:上传下载文件,删除命名文件,建立删除目录,自动压缩,保存目录
1.代码:
#coding=utf-8
'''连接远程ftp服务器,显示问候语,并打印当前工作目录'''
from ftplib import FTP
f = FTP('ftp.ibiblio.org')
print "Welcome:", f.getwelcome()
f.login()#匿名登陆
print "CWD:", f.pwd()
f.quit()
运行结果:
D:\python\python.exe E:/code/python/chap4/connect.py
Welcome: 220 ProFTPD Server
CWD: /Process finished with exit code 0
2.以ascii形式下载文件
ftp以两种形式传输文件,ASCII和二进制文件
代码1:
#coding=utf-8
from ftplib import FTP
def writeline(data):
fd.write(data + "\n")
#f = FTP('ftp.kernel.org')
f=FTP('ftp.ibiblio.org')
f.login()
f.cwd('/pub/linux/kernel')#在远处系统转换目录
fd = open('README', 'wt')
f.retrlines('RETR README', writeline)
#开始传输,第一个参数指定一个在远程系统运行的命令,后一个文件名;第二个参数是函数,客户端每收到一行数据运行一次函数;
#如果省略,数据会被输出到标准输出设备上。
fd.close()
f.quit()
运行结果:
README文件:
README for kernelWhat you’ll find here: kernel sources and patches
注:使用python实现一个基于socket的c/s模式文件传输程序。出现error: [Errno 10061]错误。查找资料提示是”目标机器积极拒绝连接”。
原因说法不过有3种:
检查目的地址或端口号书写出错。
人工检查一下代码便可排除。
目标防火墙未关闭。
使用ping命令,验证目标是否有回应,必要时可用telnet,nmap等工具尝试验证目标端口开放情况。
软件或网络状况原因。
查看python是否有联网权限,当前网络是否畅通等。
3.以二进制形式下载文件
代码:
#coding=utf-8
from ftplib import FTP
f = FTP('ftp.ibiblio.org')
f.login()
f.cwd('/pub/linux/kernel')
fd = open('README', 'wb')
f.retrbinary('RETR README', fd.write)
#retrbinary()向指定的函数输出整块数据
fd.close()
f.quit()
4.以高级形式下载文件
ntransfercmd()函数,了解传输文件细节;
代码:
#coding=utf-8
from ftplib import FTP
import sys
f = FTP('ftp.ibiblio.org')
f.login()
f.cwd('/pub/linux/kernel')
#向服务器传输一条指令,检差有没有错
f.voidcmd("TYPE I")#TYPE I表示以二进制模式传输
#retrbinary()会在后台自动执行下载指令,nsransfercmd()不会
datasock, estsize = f.ntransfercmd("RETR README")
transbytes = 0
fd = open('README', 'wb')
while 1:
buf = datasock.recv(2048)
if not len(buf):
break
fd.write(buf)
transbytes += len(buf)
sys.stdout.write("Received %d " % transbytes)
if estsize:
sys.stdout.write("of %d bytes (%.1f%%)\r" % \
(estsize, 100.0 * float(transbytes) / float(estsize)))
else:
sys.stdout.write("bytes\r")
sys.stdout.flush()
sys.stdout.write("\n")
fd.close()
datasock.close()
f.voidresp()#获得服务器响应,报错
f.quit()
运行结果:
D:\python\python.exe E:/code/python/chap4/advbinarydl.py
Received 70 of 70 bytes (100.0%)Process finished with exit code 0
5.上传数据
storbinary() read(),storlines() readline()
#coding=utf-8
from ftplib import FTP
import sys, getpass, os.path
host, username, localfile, remotepath = sys.argv[1:]
password = getpass.getpass("Enter password for %s on %s: " % \
(username, host))
f = FTP(hos