网络编程

网络编程

    python2.x/python3.x 对于网络编程的支持都是非常友好的,本身支持两部分非常有用的网络编程方式:
        传统网络编程
        非阻塞异步网络编程
    底层通过套接字 socket 对象的连接,完成多种协议的网络程序服务端/客户端的开发和数据通信。

SOCKET

socket的由来

    socket 是一种计算机网络数据结构,中文译名:套接字。

    20 世纪 70 年代,socket 是作为加利福尼亚大学的伯克利版本 Unix 系统的一部分出现的某些情况下也会被称为伯克利套接字或者 BSD 套接字。

    socket 最初是为同一主机上的应用程序创建,是主机上运行的一个程序与另一个程序之间可以完成数据通信操作,程序也称为进程,就出现了不同进程间进行数据交互的操作,因为交互的模式不同,所以也一般将程序中的套接字区分为两种:
        面向文件的套接字:通过文件进行数据交互
        面向网络的套接字:通过网络进行数据交互

    套接字最初出现之后,为了区分不同平台不同体系的套接字模型对象,定义了地址家族的概念:Adress Family,也经常简写为 AF。

    Unix 系统中的套接字就是第一种家族套接字,称为 AF_UNIX,或AF_LOCAL,这是 POSIX1标准中规范的。

    同样也有一些体系平台下,对于套接字的划分通过协议家族(Protocal Family)进行规范,可以简写为 PF,考虑到兼容性的要求,PF 和 AF 在一些平台上都集成了互相兼容的实现,python 本身支持的是更加标准化的 AF 地址家族。

    另一种地址家族就是面向网络的套接字模型对象了,经典的如 AF_INET 支持的是传统第四个版本的因特网协议寻址[IPv4],同时也提供了 AF_INET6 用于支持第六个版本的因特网协议寻址[IPv6]。

PYTHON中的套接字

    套接字模型对象,为了能明确的表示网络中一台数据交互的主机,需要通过 IP 地址寻址确定主机位置,通过 PORT 端口号确定主机交互接口在网络套接字交互过程中,出现了两种类型的套接字模型:
        面向连接的套接字模型
        面向无连接的套接字模型

    面向连接的套接字模型,在进行网络数据传输过程中,首先要创建一个连接模型,通过指定的连接模型进行数据的交互,类似我们生活中拨打电话一样,首先保证通话连接的基础上才能完成通话内容的交互,比较经典的如 TCP 端对端传输协议就是面向连接的套接字对象。

    面向无连接的套接字模型,在进行网络数据传输过程中,不需要有效的网络连接模型,在数据传输过程中只负责发送/接受,不保证数据的完整性和实效性;类似我们生活中的广播电台、电视信号等等,操作效率要比面向连接的套接字模型更加高效;比较经典的 UDP 广播协议使用的就是面向无连接的套接字对象。

    python 中提供的网络连接套接字,主要包含在 socket 模块中。
    socket 模块提供了 socket()函数可以完成如上描述的各种网络套接字的构建、通信等操作。

基本语法结构

socket.socket(socket_family, socket_type, protocal=0)
socket_family:socket 地址家族,AF_UNIX/AF_LOCAL 或者 AF_INET
socket_type:socket 连接类型
面向连接的(SOCK_STREAM),面向无连接的(SOCK_DGRAME)
protocal:传输协议,一般不用设置,使用默认值进行自动匹配就好

创建 TCP 协议的套接字 socket 对象:

tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

创建 UDP 协议的套接字 socket 对象:

udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

socket套接字常用操作
属性 描述
s.bind() 绑定(主机名称、端口)到一个套接字上
s.listen() 设置并启动TCP监听
s.accept() 等待客户端连接
s.connect() 连接指定服务器
s.connect_ex() 连接指定服务器
s.recv() 接收TCP消息
s.recv_into 接收TCP消息到缓冲区
s.send() 发送TCP消息
s.sendall() 完整发送TCP消息
s.recvfrom() 接收UDP消息
s.recvfrom_into() 接收UDP消息到缓冲区
s.sendto() 发送UDP消息
s.shutdown() 关闭连接对象
s.close() 关闭套接字对象

你可能感兴趣的:(网络编程)