python网络编程入门详解_网络编程—Python编程从入门到精通(7)

第17章、网络编程

互联网改变了人们的生活方式,生活在当今社会中的人们已经越来越离不开网络。Python语言在网络通信方面的优点特别突出,要远远领先其他语言。本章将详细讲解使用Python语言开发网络项目的基本知识,为读者步入本书后面知识的学习打下基础。

17.1、网络开发基础

在进行Python网络编程开发之前,必须首先了解计算机网络通信的基本框架和工作原理。在两台或多台计算机之间进行网络通信时,通信的双方还必须遵循相同的通信原则和数据格式。接下来将介绍OSI七层网络模型、TCP/IP协议。

17.1.1、OSI七层网络模型

OSI七层网络模型是一个开放系统互联的参考模型。通过这个参考模型,用户可以非常直观地了解网络通信的基本过程和原理。OSI七层网络模型如图17-1所示。

14982672_201812251331031HOQZ.png

从图17-1所示的OSI网络模型可以看到,网络数据从发送方到达接收方的过程中,数据的流向以及经过的通信层和相应的通信协议。事实上,在网络通信的发送端,其通信数据每到达一个通信层,该层的协议都会在数据中添加一个包头数据。而在接收方恰好相反,数据通过每一层时都会被该层协议剥去相应的包头数据。用户也可以这样理解,即网络模型中的各层都是对等通信。在OSI七层网络模型中,各个网络层都具有各自的功能,如表17-1所示。

14982672_201812251331032rYdf.png

17.1.2、TCP/IP协议

TCP/IP协议实际上是一个协议簇,其包括了很多协议。例如,FTP(文本传输协议)、SMTP(邮件传输协议)等应用层协议。TCP/IP协议的网络模型只有4层,包括数据链路层、网络层、数据传输层和应用层,如图17-2所示。

14982672_201812251331033igAp.png

在TCP/IP协议的网络模型中,各层的功能如表17-2所示。

14982672_2018122513310347Uly.png

在数据传输层中,包括了TCP和UDP协议。其中,TCP协议是基于连接的可靠的通信协议。其具有重发机制,即当数据被破坏或者丢失时,发送方将重发该数据。而UDP协议基于用户数据报协议,属于不可靠连接的通信协议。例如当使用UDP协议发送一条消息时,并不知道该消息是否已经到达接收方,或者在传输过程中数据已经丢失。但是在即时通信中,UDP协议在对一些对时间要求较高的网络中传输数据有着重要的作用。

17.2、套接字编程

应用程序通常通过"套接字"(socket)向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通信。Python语言提供了两种访问网络服务的功能。其中低级别的网络服务通过套接字实现,它提供了标准的BSD 套接字 API,可以访问底层操作系统套接字接口的全部方法。而高级别的网络服务通过模块 SocketServer实现,它提供了服务器中心类,可以简化网络服务器的开发。本节将首先讲解通过套接字对象实现网络编程的知识。

17.2.1、socket()函数介绍

在Python语言标准库中,通过使用socket模块提供的socket对象,可以在计算机网络中建立可以相互通信的服务器与客户端。在服务器端需要建立一个socket对象,并等待客户端的连接。客户端使用socket对象与服务器端进行连接,一旦连接成功,客户端和服务器端就可以进行通信了。

在Python语言,函数socket()能够创建socket对象。此函数是套接字网络编程的基础对象,具体语法格式如下所示。

socket(socket_family, socket_type,protocol=0)

其中,参数"socket_family"是AF_UNIX或AF_INET,参数"socket_type"是SOCK_STREAM或SOCK_DGRAM。参数"protocol"通常省略,默认为0。

在Python程序中,为了创建TCP/IP套接字,可以用下面的代码调用socket.socket()。

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

同样原理,在创建UDP/IP套接字时需要执行如下所示的代码。

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

因为有很多socket模块属性,所以此时可以使用"from module import "这种导入方式,但是这只是其中的一个例外。如果使用"from socket import "导入方式,那么就把socket属性引入到了命名空间中。虽然这看起来有些麻烦,但是通过这种方式将能够大大缩短代码的编写量,例如下面所示的代码。

tcpSock = socket(AF_INET, SOCK_STREAM)

一旦有了一个套接字对象,那么使用socket对象的方法可以进行进一步的交互工作。

17.2.2、socket对象的内置函数和属性

在Python语言的socket对象中,提供如表17-3所示的内置函数。

14982672_201812251331035N0ft.png

14982672_201812251331036Ysw4.png

除了上述内置函数之外,在socket模块中还提供了很多和网络应用开发相关的属性和异常。表17-4列出了一些比较常用的属性和异常信息。

14982672_201812251331037cNQp.png

17.2.3 使用套接字建立TCP"客户端/服务器"连接

当在Python程序中创建TCP服务器时,下面是一段创建通用TCP服务器的一般演示代码。读者需要记住的是,这仅仅是设计服务器的一种方式。一旦熟悉了服务器设计,可以按照自己的要求修改下面的代码来操作服务器。

ss = socket() #创建服务器套接字

ss.bind() #将套接字与地址绑定

ss.listen() #监听连接

inf_loop: #服务器无限循环

cs = ss.accept() #接受客户端连接

comm_loop: #通信循环

cs.recv()/cs.send() #对话(接收/发送)

cs.close() #关闭客户端套接字

ss.close() #关闭服务器套接字#(可选)

在Python程序中,所有套接字都是通过socket.socket()函数创建的。因为服务器需要占用一个端口并等待客户端的请求,所以它们必须绑定到一个本地地址。因为TCP是一种面向连接的通信系统,所以在TCP服务器开始操作之前,必须安装一些基础设施。特别地,TCP服务器必须监听(传入)的连接。一旦这个安装过程完成后,服务器就可以开始它的无限循环。在调用accept()函数之后,就开启了一个简单的(单线程)服务器,它会等待客户端的连接。在默认情况下,accept()函数是阻塞的,这说明执行的操作会暂停,直到一个连接到达为止。一旦服务器接受了一个连接,就会利用accept()方法返回一个独立的客户端套接字,用来与即将到来的消息进行交换。

21/212>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值