Python网络编程之socket模块基础实例

本文呢主要对Python网络编程中用到的socket模块进行初步总结。首先从网络基础理论出发,介绍了TCP协议和UDP协议;然后总结了socket中的常用函数;最后通过实际代码展示基本函数的应用。

2、网络基础

要想理解socket,首先得熟悉一下TCP/IP协议族。TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,定义了主机如何连入因特网及数据如何在它们之间传输的标准,从字面意思来看TCP/IP是TCP和IP协议的合称,但实际上TCP/IP协议是指因特网整个TCP/IP协议族。下面对TCP/IP协议族中与socket紧密相关的的TCP协议和UDP协议进行介绍。

TCP是流协议,而UDP是数据报协议。换句话说,TCP在客户机和服务器之间建立持续的开放连接,在该连接的生命期内,字节可以通过该连接写出(并且保证顺序正确)。然而,通过 TCP 写出的字节没有内置的结构,所以需要高层协议在被传输的字节流内部分隔数据记录和字段。

UDP是数据报协议,不需要在客户机和服务器之间建立连接,它只是在地址之间传输报文。UDP的一个很好特性在于它的包是自分隔的(self-delimiting),也就是一个数据报都准确地指出它的开始和结束位置。然而,UDP的一个可能的缺点在于,它不保证包将会按顺序到达,甚至根本就不保证。不过,UDP有一个很大的有点就是效率高。

TCP与UDP直接的对比就好似手机通信和邮寄信件通信。TCP犹如手机通信机制,当呼叫者通过手机拨打接受者手机,只有接受者按下接听键,两方才算建立起了连接,且只要没人挂断,连接就一直是存活的,也只有在连接存活情况下两者才能通话。UDP就如有邮局系统,只有有人来寄信,邮局就回帮他寄,但是不会去管收件人是否存在、也不管收件人什么时候能收到信,如果寄件人陆续寄出多封信,收件人收的的信先后顺序是混乱的,如果有的信没有送达,那这封信就此消失在历史的尘埃中。

通常,人们用socket来建立计算机网络中多个主机(或进程)TCP/IP间的连接。

3、socket介绍

Socket(中文译为套接字)是操作系统内核中的一个数据结构,它几乎是所有网络通信的基础。网络通信,归根到底还是进程间的通信(不同计算机上的进程间通信, 又称为网络通信, IP协议进行的主要是端到端通信)。在网络中,每一个节点(计算机或路由)都有一个网络地址,也就是IP地址。两个进程通信时,首先要确定各自所在的网络节点的网络地址。但是,网络地址只能确定进程所在的计算机,而一台计算机上很可能同时运行着多个进程,所以仅凭网络地址还不能确定到底是和网络中的哪一个进程进行通信,因此套接字中还需要包括其他的信息,也就是端口号(PORT)。在一台计算机中,一个端口号一次只能分配给一个进程,也就是说,在一台计算机中,端口号和进程之间是一 一对应的关系。

socket使用(IP地址,协议,端口号)来标识一个进程。所以,使用端口号和网络地址的组合可以唯一的确定整个网络中的一个网络进程。端口号的范围从0~65535,一类是由互联网指派名字和号码公司ICANN负责分配给一些常用的应用程序固定使用的“周知的端口”,其值一般为0~1023, 用户自定义端口号一般大于等于1024。

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。每一个socket都用一个半相关描述{协议、本地地址、本地端口}来表示;一个完整的套接字则用一个相关描述{协议、本地地址、本地端口、远程地址、远程端口}来表示。socket也有一个类似于打开文件的函数调用,该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过socket描述符来实现的。以TCP协议中socket建立连接的“三次握手”为例,其过程如下:

Python网络编程之socket模块基础实例

如图所示,当客户端通过socket调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用socket的accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。

两个socket通过“网络”交互数据进行数据交互时只负责两件事:建立连接,传递数据;同时socket在收发数据时遵循的原则:有发就有收,收发必相等!

4、socket基本使用

1)socket函数

  功能:使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字。

  格式:socket.socket([family[, type[, proto]]])

  参数:

    family : AF_INET (默认ipv4),AF_INET6(ipv6) , AF_UNIX(Unix系统进程间通信).

    type : SOCK_STREAM (TCP), SOCK_DGRAM(UDP) .

    protocol : 一般为0或者默认

  备注:如果socket创建失败会抛出一个socket.error异常

2)服务器端函数

 a)bind函数

  格式:s.bind(address)

  功能:将地址address绑定到套接字, 地址以元组(host,port)的形式表示。

  参数:

    address为元组(host,port)

    host: ip地址, 为一个字符串

    post: 自定义主机号, 为整型

b)listen函数

  格式:s.listen(backlog)

  功能:使服务器的这个端口和IP处于监听状态,等待网络中某一客户机的连接请求。如果客户端有连接请求,端口就会接受这个连接。

  参数:backlog : 操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了

c)accept函数

  格式:s.accept()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8904f81d5361dda2d2ad3418a39a94b9.html