zoukankan      html  css  js  c++  java
  • Python网络客户端

    什么是网络客户端?

    首先,我们把因特网简化成一个数据中心,数据交换的参与者是一个服务提供者和一个服务使用者。类似于“生产者-消费者”这里 服务器就是生产者,它提供服务,一般只有一个服务器喝多个消费者,就像我们之前看道德客户端/服务器模型那样。

    这里主要介绍三个网际协议---FTP、NNTP和POP3

    文件传输协议--FTP

    FTP是internet上文件传输、软件和源代码下载的主要手段之一。FTP要求输入用户名和密码才能访问FTP服务器,但它也允许没有帐号的用户以匿名用户登录(当然这需要管理员设置FTP服务器允许匿名用户登录)。这时用户名是匿名(anonymous),密码是一般是用户的电子邮件地址。

    FTP工作流程如下

    1. 客户端链接远程FTP服务器
    2. 客户端输入用户名和密码
    3. 客户端做各种文件传输和信息查询
    4. 客户端登出远程FTP服务器,结束通讯

    有时由于网络原因 会导致事务在完成之前中断。客户端在超过900秒不活动后连接就会被关闭。

    在底层,FTP使用TCP 而不是UDP。并且客户端和服务器都使用两个套接字来通讯:一个控制和命令端口(21号端口),一个数据端口(20号端口).。

    FTP有两种模式:主动和被动(Python同时支持主动被动两种模式)。只有主动模式服务器才使用数据端口。而被动模式中服务器只告诉客户端他的随即端口号码,客户端必须主动建立数据链接。

     

    Python 和 FTP

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

    ftplib.FTP类方法

     
    方法 属性
    login([user[, passwd[, acct]]])

    登录到FTP服务器,所有参数都是可选的

    pwd() 得到当前工作目录
    cwd(pathname) 把当前工作目录设置为pathname
    dir(argument[, ...[,cb]·]) 显示参数目录的内容,可选参数cb是一个回调函数他会被传给retrlines()方法
    nlst(argument[, ...]) 与dir 类似 但返回一个文件名列表 而不是显示这些文件
    retrlines(command[, callback]) 给定FTP命令 用于下载文本文件 可选的会小函数用于处理每一块下载的数据(每块默认为为8k)
    retrbinary(command, callback[, maxblocksize[, rest]]) 与上一个类似 但这个指令处理二进制文件
    storlines(command, file[, callback]) 给定FTP命令,用于上传文件 要给定一个文件对象file
    storbinary(command, file[, blocksize, callback, rest]) 与上一个类似 只是这个处理二进制文件 要给定文件对象 上传块大小默认8k
    rename(fromname, toname) 修改文件名
    delete(filename) 删除远程文件
    mkd(pathname) 创建远程目录
    rmd(dirname) 删除远程目录
    quit() 关闭链接并断开

    内容参见 http://docs.python.org/library/ftplib.html

    Python使用FTP流程为

    复制代码
    from ftplib import FTP
    f = FTP('ftp.python.org')
    f.login('anonymous','guess@who.org')
    :
    f.quit()
    复制代码

    下面我们写一段代码,假设你要从mozilla网站上下载最新的

    bugzilla-3.6.9-to-3.6.10-nodocs.diff.gz 代码

    代码示例

    复制代码
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    import ftplib
    import os
    import socket
    
    HOST = 'ftp.mozilla.org'
    DIRN = 'pub/mozilla.org/webtools'
    FILE = 'bugzilla-3.6.9-to-3.6.10-nodocs.diff.gz'
    
    def writedata(data):
        f = open(FILE,'wb')
        try:
            f.write(data)
        finally:
            f.close()
    
    def main():
        try:
            f = ftplib.FTP(HOST)
        except (socket.error, socket.gaierror):
            print 'ERROR:cannot reach " %s"' % HOST
            return
        print '***Connected to host "%s"' % HOST
    
        try:
            f.login()
        except ftplib.error_perm:
            print 'ERROR: cannot login anonymously'
            f.quit()
            return
        print '*** Logged in as "anonymously"' 
    
        try:
            f.cwd(DIRN)
        except ftplib.error_perm:
            print 'ERRORL cannot CD to "%s"' % DIRN
            f.quit()
            return
        print '*** Changed to "%s" folder' % DIRN
    
        try:
            #传一个回调函数给retrbinary() 它在每接收一个二进制数据时都会被调用
            f.retrbinary('RETR %s' %FILE, writedata)
        except ftplib.error_perm:
            print 'ERROR: cannot read file "%s"' %FILE
            os.unlink(FILE)  #由于某些原因无法保存这个文件时 要把空文件删掉
        else:
            print '*** Downloaded "%s" to CWD' % FILE
        
        f.quit()
        return
    
    if __name__ == '__main__':
        main()
    复制代码

    运行代码将输出一下内容 并将

    bugzilla-3.6.9-to-3.6.10-nodocs.diff.gz 下载到电脑
    复制代码
    ***Connected to host "ftp.mozilla.org"
    *** Logged in as "anonymously"
    *** Changed to "pub/mozilla.org/webtools" folder
    *** Downloaded "bugzilla-3.6.9-to-3.6.10-nodocs.diff.gz" to CWD
    复制代码


    作者:GoodSpeed Cheng 
    出处:http://www.cnblogs.com/cacique/ 
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    归并排序(Merge Sort)
    AtCoder AGC035D Add and Remove (状压DP)
    AtCoder AGC034D Manhattan Max Matching (费用流)
    AtCoder AGC033F Adding Edges (图论)
    AtCoder AGC031F Walk on Graph (图论、数论)
    AtCoder AGC031E Snuke the Phantom Thief (费用流)
    AtCoder AGC029F Construction of a Tree (二分图匹配)
    AtCoder AGC029E Wandering TKHS
    AtCoder AGC039F Min Product Sum (容斥原理、组合计数、DP)
    AtCoder AGC035E Develop (DP、图论、计数)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2654077.html
Copyright © 2011-2022 走看看