网络编程—Python编程从入门到精通(7)

发表于:2018-12-26 10:59

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:叶维忠    来源:51Testing软件测试网原创

#
Python
分享:
  第17章、网络编程
  互联网改变了人们的生活方式,生活在当今社会中的人们已经越来越离不开网络。Python语言在网络通信方面的优点特别突出,要远远领先其他语言。本章将详细讲解使用Python语言开发网络项目的基本知识,为读者步入本书后面知识的学习打下基础。
  17.1、网络开发基础
  在进行Python网络编程开发之前,必须首先了解计算机网络通信的基本框架和工作原理。在两台或多台计算机之间进行网络通信时,通信的双方还必须遵循相同的通信原则和数据格式。接下来将介绍OSI七层网络模型、TCP/IP协议。
  17.1.1、OSI七层网络模型
  OSI七层网络模型是一个开放系统互联的参考模型。通过这个参考模型,用户可以非常直观地了解网络通信的基本过程和原理。OSI七层网络模型如图17-1所示。
  
  从图17-1所示的OSI网络模型可以看到,网络数据从发送方到达接收方的过程中,数据的流向以及经过的通信层和相应的通信协议。事实上,在网络通信的发送端,其通信数据每到达一个通信层,该层的协议都会在数据中添加一个包头数据。而在接收方恰好相反,数据通过每一层时都会被该层协议剥去相应的包头数据。用户也可以这样理解,即网络模型中的各层都是对等通信。在OSI七层网络模型中,各个网络层都具有各自的功能,如表17-1所示。
  17.1.2、TCP/IP协议
  TCP/IP协议实际上是一个协议簇,其包括了很多协议。例如,FTP(文本传输协议)、SMTP(邮件传输协议)等应用层协议。TCP/IP协议的网络模型只有4层,包括数据链路层、网络层、数据传输层和应用层,如图17-2所示。
 
  在TCP/IP协议的网络模型中,各层的功能如表17-2所示。
  在数据传输层中,包括了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所示的内置函数。
  除了上述内置函数之外,在socket模块中还提供了很多和网络应用开发相关的属性和异常。表17-4列出了一些比较常用的属性和异常信息。
  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()方法返回一个独立的客户端套接字,用来与即将到来的消息进行交换。

相关阅读:
版权声明:51Testing软件测试网获人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号