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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值