开发FTP文件传输程序—Python编程从入门到精通(9)

发表于:2018-12-28 11:36

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

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

  17.8、解析JSON数据
  JSON是JavaScript Object Notation的缩写,是一种轻量级的数据交换格式。JSON基于ECMAScript的一个子集。本节将详细讲解使用Python语言解析JSON数据的知识。
  17.8.1、类型转换
  在JSON的编码和解码过程中,Python的原始类型与JSON类型会相互转换。其中从Python类型编码为JSON类型的转换关系如表17-6所示。
  从JSON类型解码为Python类型的转换关系如表17-7所示。
 
  17.8.2、编码和解码
  在Python程序中,可以使用JSON模块来对JSON数据进行编码和解码操作,其中包含了如下所示的两个函数。
  " json.dumps():对数据进行编码。
  " json.loads():对数据进行解码。
  下面的实例代码演示了将Python 字典类型转换为JSON对象的过程。
  实例17-11 将Python字典类型转换为JSON对象
  源码路径 daima\17\17-11
  实例文件js.py的具体实现代码如下所示。
import json
#Python将字典类型转换为JSON对象
data = {
'no' : 1,
'name' : 'laoguan',
'url' : 'http://www.toppr.net'
}
json_str = json.dumps(data)
print ("Python 原始数据:", repr(data))
print ("JSON 对象:", json_str)
  执行后的效果如图17-12所示。通过输出结果可以看出,简单类型通过编码后与其原始的repr()输出结果非常相似。
  
  接着上面的实例17-11,在下面的实例中,可以将一个JSON编码的字符串转换回一个Python数据结构。
  实例17-12 将JSON对象转换为Python字典
  源码路径 daima\17\17-12
  实例文件fan.py的具体实现代码如下所示。
import json
#将字典类型转换为JSON对象
data1 = {
'no' : 1,
'name' : 'laoguan',
'url' : 'http://www.toppr.net'
}
json_str = json.dumps(data1)
print ("Python 原始数据:", repr(data1))
print ("JSON 对象:", json_str)
# 将 JSON 对象转换为字典
data2 = json.loads(json_str)
print ("data2['name']: ", data2['name'])
print ("data2['url']: ", data2['url'])
  执行后的效果如图17-13所示。
 
  在Python程序中,如果要处理的是JSON文件而不是字符串,那么可以使用函数json.dump()和函数json.load()来编码和解码JSON数据。例如下面的演示代码。
#写入JSON数据
with open('data.json', 'w') as f:
json.dump(data, f)
#读取数据
with open('data.json', 'r') as f:
data = json.load(f)
  17.9、技术解惑
  17.9.1、详细剖析客户端/服务器编程模型
  客户端/服务器编程模型是基于可靠连接的通信模型。通信的双方必须使用各自的IP地址以及端口进行通信。否则,通信过程将无法实现。通常情况下,当用户使用C/S模型进行通信时,其通信的任意一方称为客户端,而另一方称为服务器端。
  服务器端等待客户端连接请求的到来,这个过程称为监听过程。通常,服务器监听功能是在特定的IP地址和端口上进行。然后,客户端向服务器发出连接请求,服务器响应该请求,则连接成功。否则,客户端的连接请求失败。客户端/服务器编程模型如图17-14所示。
  由于客户端连接服务器时,需要使用服务器的IP地址和监听端口号才能完成连接,所以服务器的IP地址和端口必须是固定的。在这里,向用户介绍部分协议所使用的端口号码。例如,HTTP协议(网页浏览服务)所使用的端口号为80,FTP协议(文本传输)所使用的端口号是21。
  在现实应用中,最常见的客户端/服务器应用模式是动态Web网站。动态网站的工作原理非常简单,如图17-15所示。
 
  本地计算机是指用户正在使用的、浏览站点页面的机器。对于本地计算机来说,最重要的构成模块是Web浏览器,其中浏览器有IE、Firefox和谷歌等。浏览器是WWW(World Wide Web,万维网)系统的重要组成部分,它是运行在本地计算机中的程序,负责向服务器发送请求,并且将服务器返回的结果显示给用户。用户就是通过浏览器这个窗口来分享网上丰富的资源的。常见的网页浏览器有Internet Explorer、Firefox、Opera和Safari。
  远程服务器是一种高性能计算机,作为网络的节点,存储、处理网络上80%的数据、信息,因此也称为网络的灵魂。它是网络上一种为客户端计算机提供各种服务的高性能计算机,在网络操作系统的控制下,它将与其相连的硬盘、磁带、打印机、调制解调器及各种专用通信设备与网络上的客户站点共享,也能为网络用户提供集中计算、信息发表及数据管理等服务。它的高性能主要体现在高速的运算能力、长时间可靠的运行状况、强大的外部数据吞吐能力等方面。远程服务器的主要功能是接收客户浏览器发来的请求,然后分析请求并给予响应,响应的信息通过网络返回给用户浏览器。
  接下来开始讲解Web应用程序的工作原理,用户访问互联网资源的前提是必须首先获取站点的地址,然后通过页面链接来浏览具体页面的内容。其实上述过程是通过浏览器和服务器进行的。下面以访问搜狐网为例,详细讲解Web应用程序的工作原理。
  (1)在浏览器地址栏中输入搜狐网的首页地址"http://www.sohu.com"。
  (2)用户浏览器向服务器发送访问搜狐网首页的请求。
  (3)服务器获取客户端的访问请求。
  (4)服务器处理请求。如果请求页面是静态文档,则只须将此文档直接传送给浏览器即可;如果是动态文档,则将处理后的静态文档发送给浏览器。
  (5)将处理后的结果在客户端浏览器中显示。
  17.9.2、详细剖析类HTTPConnection中的方法
  在Python程序中,类HTTPConnection的构造方法的语法格式如下所示。
  HTTPConnection (host, port=None,[ timeout, ] source.address=None)
  " host:服务器地址,可以使用www.***.com:8080模式。
  " port:用来指定访问的服务器端口。如果不提供,则从host提取;否则,使用80端口。
  " timeout:指定超时秒数。
  在Python程序中,HTTPConnection对象的主要方法是request()。此方法的语法格式如下所示。
  Request(method, url, body, headers)
  " method:发送方式,一般为"GET"或"POST"。
  " url:进行操作的URL。
  " body:发送的数据。
  " headers:发送的HTTP头。
  当向服务器发送请求后,可以使用HTTPConnection对象中的方法getresponse()返回一个HTTPResponse对象。使用HTTPConnection对象中的方法close()可以关闭同服务器的连接。除了使用request()方法以外,还可以依次使用如下的方法向服务器发送请求。
  " 方法putrequest()。
  方法putrequest()在连接到服务器后第一个调用,功能是发送method字符串、url字符串、 HTTP版本(HTTP/1.1)的行数据到服务器。当设置skip_host为非False值时可禁止自动发送到主机;当设置skip_accept_encoding为非False值时可以禁止接受编码。skip_accept_encoding为Python2.4中添加的。方法putrequest()的语法格式如下所示。
  putrequest(method, url[, skip_host[, skip_accept_encoding]])
  " 方法putheader()。
  方法putheader()的功能是发送一个RFC 822样式头到服务器。它发送header、一个冒号和一个空格以及第一个参数到服务器。如果有更多参数,就会发送多行,每行由一个制表符和一个参数组成。方法putheader()的语法格式如下所示。
  putheader(header, argument[, ...])
  " 方法endheaders()。
  方法endheaders()的功能是发送空行到服务器,设置header的结束。可选参数message_ body用来传递与请求相关的消息正文。如果传递的消息正文是字符串,则将在消息头的包中发送;否则,使用单独的数据包进行发送。从Python 2.7开始加入了message_body。方法endheaders()的语法格式如下所示。
  endheaders(message_body=None)
  " 方法send()。
  方法send()的功能是将数据发送到服务器,在endheaders()之后、getresponse()之前使用。
  17.10、课后练习
  (1)编写一个机器人聊天程序,要求同时实现客户端和服务器端。
  (2)编写一个文件上传程序,要求同时实现客户端和服务器端。
  (3)编写一个程序,利用select监听终端。
  (4)编写一个程序,利用select实现伪同时处理多个套接字客户端请求,要求同时实现客户端和服务器端。

相关阅读:
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号