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/ 
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    TextView 高亮
    Android 学习 第一章(环境搭建)
    从assets res 中读文件
    动态设置imageview 宽高
    android 算定义view 打包 jar(一次开发多次使用)
    Activity 跳转
    Android手机在开发调试时logcat不显示输出信息的解决办法
    弹出对话 AlertDialog 有按钮
    让划动 listview时 没有黑色背景
    Activity Service 数据相互操作
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2654077.html
Copyright © 2011-2022 走看看