zoukankan      html  css  js  c++  java
  • 网络编程socket-SocketServer-FTP

    16章 网络编程
    ?应该是讲网络之间如何编程来进行通信的章节

    16.1.1 客户端/服务器架构
    ?客户端请求访问,服务器端监听请求,处理请求,进行相应的模式
    16.1.2 客户端/服务器编程
    ?服务器端:创建通讯端点,以用来监听。并将自身位置确定,既URL
      客户端:创建通讯端点,建立到服务器的连接

    16.2  套接字:通讯断点
    ?是一种通讯必需的网络数据结构,就像电话接口,它是一种数据接口
    套接字地址:套接字要有主机地址和端口(0-65535)
    套接字类型:
    面向连接:通信前要建立一条连接:实现的协议时TCP
    无连接:实现的协议时UDP
    它们这些套接字都是使用IP协议来在网络中寻找主机。

    16.3 使用python来实现网络编程通信
    16.3.1 socket()模块
    ?socket.socket()函数可以创建套接字
    分别建立TCP/IP,UDP/IP的套接字
    tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 第一个是家族协议,它们都是网络的。第二个是面向类型
    udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    16.3.2 套接字方法
    ?创建套接字后,要用它具有的方法来进行通信
    16.3.3 创建一个TCP服务器
    思路:创建套接字---绑定套接字到一个本地地址---监听连接---无限循环接听TCP客户端请求(接收到后会返回客户端套接字)---接受TCP数据---发送TCP数据---关闭子套接字---关闭服务器套接字
    from socket import *
    from time import ctime

    HOST = '' # 表示可以绑定任何有效地址
    PORT = 2157
    BUFSIZ = 1024 # 关键字,大小为1k
    ADR= (HOST, PORT)

    tcpSerSock = socket(AF_INET, SOCK_STREAM) # 创建基于网络的、TCP服务器套接字
    tcpSerSock.bind(ADR)
    tcpSerSock.listen(5) # 只允许5个连接同时

    while True: # 无限循环接听
        print 'waiting for connecttion....'
        tcpCliSock, addr = tcpSerSock.accept() # 接收,并将客户端套接字、客户端地址保存
        print '...conneted from:', addr

        while True:
            data = tcpCliSock.recv(BUFSIZ) # 读取缓冲区的数据
            if not data:
                break
            tcpCliSock.send('{0} {1}' .format(ctime(), data)) #发送给客户端信息
        tcpCliSock.close()
    tcpSerSock.close()

    16.3.4 创建TCP客户端
    思路:创建客户端套接字---进行连接---发送数据(发送为空就退出)---从缓冲区接收数据(接收失败就退出)---关闭客户端套接字
    from socket import *

    HOST = 'localhost'
    PORT = 21567
    BUFSIZ = 1024
    ADDR = (HOST, PORT)

    tcpCliSock = socket(AF_INET, SOCK_STREAM)
    tcpCliSock.connect(ADDR)

    while True:
        data = raw_input('>')
        if not data:
            break
        tcpCliSock.send(data)
        data = tcpCliSock.recv(BUFSIZ)
        if not data:
            break
        print data
    tcpCliSock.close()

    16.3.6 创建一个UDP服务器
    思路:创建套接字---绑定套接字到一个本地地址--接收数据---发送数据
    from socket import *
    from time import ctime

    HOST = '' # 表示可以绑定任何有效地址
    PORT = 2157
    BUFSIZ = 1024 # 关键字,大小为1k
    ADR= (HOST, PORT)

    udpSerSock = socket(AF_INET, SOCK_DGRAM)
    udpSerSock.bind(ADR)

    while True:
        print 'waiting for message...'
        data, addr = udpSerSock.recvfrom(BUFSIZ)
        udpSerSock.sendto('{0} {1}' .format(ctime(), data), addr)
        print '...received from and returned to:', addr
    udpSerSock.close()

    16.3.7 创建一个UDp客户端
    思路:创建客户端套接字---发送数据---接收数据
    from socket import *
    from time import ctime

    HOST = 'localhost' # 表示可以绑定任何有效地址
    PORT = 2157
    BUFSIZ = 1024 # 关键字,大小为1k
    ADDR= (HOST, PORT)

    udpCliSock = socket(AF_INET, SOCK_DGRAM)

    while True:
        data = raw_input('>')
        if not data:
            break
        udpCliSock.sendto(data, ADDR)
        data, ADDR = udpCliSock.recvfrom(BUFSIZ)
        if not data:
            break
        print data
    udpCliSock.close()

    16.4 SocketServer 模块
    ?是标准库中用于简化实现网络客户端与服务器所需的大量样版代码,将很多需要的代码封装好

    164.1 创建一个基于SocketServer 的TCP服务器
    思路:先继承StreamRequestHandler创建请求处理类,重写handle函数---调用TCPServer使用参数“请求处理类”生成TCP服务器---服务器无限循环
    from SocketServer import (TCPServer as TCP, StreamRequestHandler as SRH)
    from time import ctime

    HOST = ''
    PORT = 21567
    ADDR = (HOST, PORT)

    class MyRequestHandler(SRH): #  定义继承StreamRequestHandler的请求类,重写handle函数(默认是pass)
        def handle(self):
            print '...connected from:', self.client_address
            self.wfile.write('{0} {1}' .format(ctime(), self.rfile.readline()))  # 分别读,写
    tcpServ = TCP(ADDR, MyRequestHandler)  # 调用TCPServer要求参数addr和请求处理类
    print 'waiting for connection...'
    tcpServ.serve_forever()  # 这个服务器进入无限循环

    16.4.2 创建一个基于SocketServer的TCP客户端
    思路:创建客户端套接字---发送数据---接收数据---关闭套接字
    from socket import *

    HOST = 'localhost'
    PORT = 21567
    BUFSIZ = 1024
    ADDR = (HOST, PORT)

    while True:
        tcpCliSock = socket(AF_INET, SOCK_STREAM)  # 与之前的区别在这里,SocketServer的请求处理器的默认行为是接受连接,得到请求,就关闭连接,所以要每次都要创建一个套接字
        tcpCliSock.connect(ADDR)
        data = raw_input('>')
        if not data:
            break
        tcpCliSock.send('%s ' % data)
        data = tcpCliSock.recv(BUFSIZ)
        if not data:
            break
        print data.strip()
        tcpCliSock.close()

    16.5 Twisted 框架
    ?是一个完全时间驱动的网络框架,允许使用和开发完全异步的网络应用程序和协议

    17 网络客户端编程
    ?基于TCP/UDP等低级别的协议,开发出来特定用途的协议,包括FTP/SCP,NNTP,SMTP
    现在我们基于这些协议学习开发客户端(相对与服务器)

    17.2 文件传输

    17.2.2 文件传输协议FTP
    流程:客户端连接远程的FTP服务器---客户端输入用户名和密码(或者匿名)---客户端做各种文件传输和信息查询操作---客户端登出远程FTP服务器,通讯结束

    17.2.6 实例
    import ftplib
    import os
    import socket

    HOST = 'ftp.mozilla.org'
    DIRN = 'pub/webtools'
    FILE = 'bugzilla-LATEST.tar.gz'

    def main():
        try:
            f = ftplib.FTP(HOST)
        except (socket.error, socket.gaierror), e:
            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 '*** Login in as "anonymous'

        try:
            f.cwd(DIRN)
        except ftplib.error_perm:
            print 'ERROR: cannot CD to "%s"' % DIRN
            f.quit()
            return
        print '*** Changed to "%s" folder' % DIRN

        try:
            f.retrbinary('RETR %s' % FILE, open(FILE, 'wb').write)
        except ftplib.error_perm:
            print 'ERROR: cannot read file "%s" to CWD' % FILE
        f.quit()
        return

    if __name__ == '__main__':
        main()

  • 相关阅读:
    iOS 微信分享提示 未验证应用
    iOS 升级xcode12后原项目模拟器运行报错
    ZK进程监控
    kakafka
    mysql 通过使用联全索引优化Group by查询
    4. php反序列化从入门到放弃(放弃篇)
    微慕小程序专业版V3.5发布-小商店
    C++ Singleton模式
    C语言的clone与mmap调用
    InnoDB MVCC机制
  • 原文地址:https://www.cnblogs.com/ohmydenzi/p/5617840.html
Copyright © 2011-2022 走看看