C/S 架构 & 套接字

C/S 架构的全称是 Client/Server,即客户端/服务器架构;它是一种网络体系架构,通常采取两层:服务器负责数据的管理,客户端负责完成与用户的交互任务

socket 即套接字,是计算机网络数据结构,任何类型的通信开始之前,网络应用必须创建套接字;最初是为同一主机上的应用程序创建,用于进程间通信(Inter Process Communication, IPC)。

类型:

  • 基于文件
  • 面向网路

家族:

  • AF_UNIX / AF_LOCAL
  • AF_INET
  • AF_NETLINK
  • AF_TIPC

套接字地址:主机-端口对(0-65535,小于 1024 为系统预留端口),https://www.iana.org/assignments/port-numbers

状态:

  • 面向连接套接字:TCP/IP,SOCK_STREAM
  • 无连接套接字:UDP/IP,SOCK_DGRAM

    socket 模块

    socket() 函数

    函数语法:socket (socket_family, socket_type, protocol=0),protocol 通常省略,默认为 0
    1
    2
    3
    4
    5
    from socket import *
    #创建 TCP/IP 套接字
    tcpSock = socket (AF_INET, SOCK_STREAM)
    #创建 UDP/IP 套接字
    udpSock = socket (AF_INET, SOCK_DGRAM)

    内置方法

    | 用途 | 函数 | 描述 |
    |———|————————-|————————————————-|
    | 服务器端 | s.bind() | 绑定地址(主机名,端口号对)到套接字 |
    | 服务器端 | s.listen() | 开始 TCP 监听 |
    | 服务器端 | s.accept() | 被动接受 TCP 客户端链接,(阻塞式)等待链接的到来 |
    | 客户端 | s.connect() | 主动初始化 TCP 服务器链接 |
    | 客户端 | s.connect_ex() | connect() 扩展版本,出错时返回错误码,而不是抛出异常 |
    | 公共用途 | s.recv() | 接受 TCP 数据 |
    | 公共用途 | s.send() | 发送 TCP 数据 |
    | 公共用途 | s.sendall() | 完整发送 TCP 数据 |
    | 公共用途 | s.recvfrom() | 接受 UDP 数据 |
    | 公共用途 | s.sendto() | 发送 UDP 数据 |
    | 公共用途 | s.getpeername() | 链接到当前套接字的远程的地址(TCP 链接) |
    | 公共用途 | s.getsockname() | 当前套接字的地址 |
    | 公共用途 | s.getsockopt() | 返回当前套接字的参数 |
    | 公共用途 | s.setsockopt() | 设置指定套接字的参数 |
    | 公共用途 | s.close() | 关闭套接字 |
    | 面向模块 | s.setblocking() | 设置套接字的阻塞与非阻塞模式 |
    | 面向模块 | s.settimeout() | 设置阻塞套接字操做的超时时间 |
    | 面向模块 | s.gettimeout() | 获得阻塞套接字操做的超时时间 |
    | 面向文件 | s.fileno() | 套接字文件描述符 |
    | 面向文件 | s.makefile() | 建立一个与该套接字关联的文件对 |

    伪代码实例

    TCP 服务器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #创建 TCP/IP 服务器套接字
    ss = socket ()
    #套接字与地址绑定
    ss.bind()
    #监听连接
    ss.listen()
    #服务器无限循环
    inf_loop:
    #接受客户端连接
    cs =ss.accept()
    #通信循环
    comm_loop:
    #对话接收/发送
    cs.recv()/cs.send()
    #关闭客户端套接字
    cs.close()
    #关闭服务器套接字
    ss.close()
    SocketServer 模块以 socket 为基础而创建的高级套接字通信模块,支持客户端请求的线程和多线程处理

    TCP 客户端

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #创建 TCP/IP 服务器套接字
    cs = socket ()
    #尝试连接服务器
    cs.connect()
    #通信循环
    comm_loop:
    #对话发送/接收
    cs.send()/cs.recv()
    #关闭客户端套接字
    cs.close()

    UDP 服务器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #创建 TCP/IP 服务器套接字
    ss = socket ()
    #套接字与地址绑定
    ss.bind()
    #监听连接
    ss.listen()
    #服务器无限循环
    inf_loop:
    #对话接收/发送
    cs=ss.recvfrom()/ss.sendto()
    #关闭客户端套接字
    cs.close()
    #关闭服务器套接字
    ss.close()

    UDP 客户端

    1
    2
    3
    4
    5
    6
    7
    8
    #创建 TCP/IP 服务器套接字
    cs = socket ()
    #通信循环
    comm_loop:
    #对话发送/接收
    cs.sendto()/cs.recvfrom()
    #关闭客户端套接字
    cs.close()

    socket 模块属性

    SocketServer 模块

    3.x 重命名为 socketserver,使编写一个 Socket 服务器通信变得更加简单,其实就是对 socket 的再封装

    模块类

    | 类 | 描述 |
    |——————————————————————-|———————————————————-|
    | BaseServer | 包括服务器的核心功能与混合类的一些功能 |
    | TCPServer/UDPServer | 基本的网络同步 TCP/UDP 服务器 |
    | UnixStreamServer/UnixDatagramServer | 基本的文件同步 TCP/UDP 服务器 |
    | ForkingMixIn/ThreadingMixIn | 实现了核心的进程/线程化功能,用于与服务器类进行混合,提供异步特性 |
    | ForkingTCPServer/ForkingUDPServer | ForkingMixIn 和 TCPServer/UDPServer 组合 |
    | ThreadingTCPServer/ThreadingUDPServer | Threading 和 TCPServer/UDPServer 组合 |
    | BaseRequestHandler | 用于定制 Handler 类型 |
    | StreamRequestHandler/DatagramRequestHandler | TCP/UDP 请求处理类的一个实现 |

    Twisted 框架

    Twsited 是一个完整的事件驱动的网络框架,基于它能使用和开发完整的异步网络应用程序和协议;它不属于 Python 标准库,需要单独安装

它提供了大量的支持来建立完整的系统:网络协议、线程、安全性和身份认证、聊天/即时通信、数据库管理、关系数据库集成、Web/Internet、电子邮件、命令行参数、GUI 集成工具包等