第17章 网络客户端编程(1)

17.2 文件传输

17.2.1 文件传输网际协议

有很多协议可以供因特网上传输文件使用。最流行的有文件传输协议(File Transfer Protocol, FTP)、Unix-to-Unix复制协议(Unix-to-Unix Copy Protocol, UUCP)和网页的超文本传输协议(Hypertext Transfer Protocol, HTTP)。另外,还有(Unix下的)远程文件复制指令rcp(以及更安全、更灵活的scp和rsync)。

HTTP主要用于网页文件的下载和访问Web服务上。它一般不要求用户输入登录的用户名密码就可以访问服务器上的文件和服务。HTTP文件传输请求主要用于获取网页文本下载。

scp和rsync要求用户登录到服务器,否则不能上传或下载文件。至于FTP,跟scp/rsync一样,可以上传或下载文件,还采用了Unix的多用户的概念,用户一定要输入有效的用户名和密码才能使用。不过,FTP也允许匿名登录。

17.2.2 文件传输协议(FTP)

文件传输协议由已故的Jon Postel和Joyce Reynolds开发,主要用于匿名下载公共文件。也可以用于两台电脑之间传输文件,尤其是在使用Unix系统作为文件存储系统,使用其他机器来工作的情况。早在网络流行之前,FTP就是在因特网上文件传输、软件和源代码下载的主要手段之一。

FTP要求用户输入用户名和密码才能访问远程的FTP服务器,但它也允许没有帐号的用户以匿名用户登录。不过,管理员要先设置FTP服务器允许匿名用户登录。

其工作流程如下:

1.客户端远程连接的FTP服务器。

2.客户端输入用户名和密码(或“匿名”和电子邮件地址)

3.客户端做各种文件传输和信息查询操作

4.客户端登出远程FTP服务器,结束通讯

在底层上,FTP只使用TCP——它不使用UDP。而且,FTP是客户端/服务器编程中很“与众不同”的例子。客户端和服务器都使用两个套接字来通讯:一个是控制和命令端口(21号端口),另一个是数据端口(有时是20号端口).

FTP有两种模式:主动和被动。只有主动模式服务器才使用数据端口。在服务器把20号端口设置为数据端口后,它“主动”连接客户端的数据端口。而被动模式中。服务器只是告诉客户端它的随机端口的号码,客户端必须主动建立数据连接。在这种模式下,你会看到,FTP服务器在建立数据连接时是“被动”的。

一般在客户端超过15分钟(900秒)不活动之后,连接就会被关闭。

17.2.3 Python和FTP

在使用Python的FTP支持时,你所需要做的就是导入ftplib模块,并实例化一个ftplib.FTP类对象。

import string
from ftplib import FTP
bufsize=1024
def Get(filename):
    command='RETR '+filename
    ftp.retrbinary(command,open(filename,'wb').write,bufsize)
    print 'download successfully'
def Put(filename):
    command='STOR '+filename
    filehandler=open(filename,'rb')
    ftp.storbinary(command,filehandler,bufsize)
    filehandler.close()
    print 'upload successfully'
def PWD():
    print ftp.pwd()
def Size(filename):
    print ftp.size(filename)
def Help():
    print '''
    ==============================
         Simple Python FTP
    ==============================
    cd       enter document
    delete   delete file
    dir      get files list
    get      download file
    help     help
    mkdir    create document
    put      upload file
    pwd      get current path
    rename   rename file name
    rmdir    delete document
    size     get file size
    '''
server=raw_input('enter FTP server info: ')
ftp=FTP(server)
username=raw_input('username:')
password=raw_input('password')
ftp.login(username,password)
print ftp.getwelcome()
actions={'dir':ftp.dir,'pwd':PWD,'cd':ftp.cwd,'get':Get,
         'put':Put,'help':Help,'rmdir':ftp.rmd,
         'mkdir':ftp.mkd,'delete':ftp.delete,
         'size':Size,'rename':ftp.rename}
while True:
    print 'pyftp',
    cmds=raw_input
    cmd=string.split(cmds)
    try:
        if len(cmd)==1:
            if string.lower(cmd[0])=='quit':
                break
            else:
                actions[string.lower(cmd[0])]
        elif len(cmd)==2:
            actions[string.lower(cmd[0])](cmd[1])
        elif len(cmd)==3:
            actions[string.lower(cmd[0])](cmd[1],cmd[2])
        else:
            print 'type error'
    except:
        print 'command error'
ftp.quit()

17.2.7 FTP的其他方面

URL/URI的第一部分就用来表示所使用的协议,比如“http://1123”,这就告诉浏览器要使用HTTP作为给定网站进行通讯的协议。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值