Python后端(一)——客户端/服务端

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 网址组成(四部分)     协议      http, https(https 是加密的http)     主机      g.cn zhihu.com之类的网址     端口      HTTP 协议默认是 80,因此一般不用填写     路径      下面的「/」和「/question/31838184」都是路径 http://www.

网址组成(四部分)

    协议      http, httpshttps 是加密的http

    主机      g.cn zhihu.com之类的网址

    端口      HTTP 协议默认是 80,因此一般不用填写

    路径      下面的「/」和「/question/31838184」都是路径

http://www.zhihu.com/

http://www.zhihu.com/question/31838184


 

电脑通信靠IP地址,IP地址记不住就发明了域名(domain name),然后电脑自动向DNS服务器(domain name server)查询域名对应的IP地址


比如g.cn这样的网址,可以通过电脑的ping程序查出对应IP 地址

   ping g.cn

PING g.cn (74.125.69.160): 56 data bytes




端口是什么?

一个比喻:

用邮局互相写信的时候,ip相当于地址(也可以看做邮编,地址是域名)

端口是收信人姓名(因为一个地址比如公司、家只有一个地址,但是却可能有很多收信人)

端口就是一个标记收信人的数字。

端口是一个16 位的数字,所以范围是 0-655352**16

 

——HTTP协议——


一个传输协议,协议就是双方都遵守的规范。

为什么叫超文本传输协议呢,因为收发的是文本信息。

1,浏览器(客户端)按照规定的格式发送文本数据(请求)到服务器

2,服务器解析请求,按照规定的格式返回文本数据到浏览器

3,浏览器解析得到的数据,并做相应处理


请求和返回是一样的数据格式,分为4部分:

1,请求行或者响应行

2Header(请求的 Header Host 字段是必须的,其他都是可选)

3\r\n\r\n(连续两个换行回车符,用来分隔HeaderBody

4Body(可选)


请求的格式,注意大小写(这是一个不包含Body的请求):

原始数据如下

'GET / HTTP/1.1\r\nhost:g.cn\r\n\r\n'

打印出来如下

GET / HTTP/1.1

Host: g.cn


其中

1GET 是请求方法(还有POST等,这就是个标志字符串而已)

2/ 是请求的路径(这代表根路径)

3HTTP/1.1  中,1.1是版本号,通用了20


具体字符串是'GET / HTTP/1.1\r\nhost:g.cn\r\n\r\n'



返回的数据如下

HTTP/1.1 301 Moved Permanently

Alternate-Protocol: 80:quic,p=0,80:quic,p=0

Cache-Control: private, max-age=2592000

Content-Length: 218

Content-Type: text/html; charset=UTF-8

Date: Tue, 07 Jul 2015 02:57:59 GMT

Expires: Tue, 07 Jul 2015 02:57:59 GMT

Location: http://www.google.cn/

Server: gws

X-Frame-Options: SAMEORIGIN

X-XSS-Protection: 1; mode=block




Body部分太长,先不贴了

其中响应行(第一行):

1HTTP/1.1 是版本

2301 是「状态码」,参见文末链接

3Moved Permanently 是状态码的描述

浏览器会自己解析Header部分,然后将Body显示成网页




——web服务器做什么——


主要就是解析请求,发送相应的数据给客户端。

例如附件中的代码(1client.py)就是模拟浏览器发送HTTP 请求给服务器并把收到的所有信息打印出来(使用的是最底层的 socket,现阶段不必关心这种低层,web开发是上层开发)

 

// 客户端代码实例:

 

 1 # coding: utf-8
 2 
 3 import socket
 4 
 5 
 6 # socket 是操作系统用来进行网络通信的底层方案
 7 # 简而言之, 就是发送 / 接收数据
 8 
 9 # 创建一个 socket 对象
10 # 参数 socket.AF_INET 表示是 ipv4 协议
11 # 参数 socket.SOCK_STREAM 表示是 tcp 协议
12 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
13 # 这两个其实是默认值, 所以你可以不写, 如下
14 # s = socket.socket()
15 # s = ssl.wrap_socket(socket.socket())
16 
17 # 主机(域名或者ip)和端口
18 host = 'g.cn'
19 port = 80
20 # 用 connect 函数连接上主机, 参数是一个 tuple
21 s.connect((host, port))
22 
23 # 连接上后, 可以通过这个函数得到本机的 ip 和端口
24 ip, port = s.getsockname()
25 print('本机 ip 和 port {} {}'.format(ip, port))
26 
27 # 构造一个 HTTP 请求
28 http_request = 'GET / HTTP/1.1\r\nhost:{}\r\n\r\n'.format(host)
29 # 发送 HTTP 请求给服务器
30 # send 函数只接受 bytes 作为参数
31 # str.encode 把 str 转换为 bytes, 编码是 utf-8
32 request = http_request.encode('utf-8')
33 print('请求', request)
34 s.send(request)
35 
36 # 接受服务器的响应数据
37 # 参数是长度, 这里为 1023 字节
38 # 所以这里如果服务器返回的数据中超过 1023 的部分你就得不到了
39 response = s.recv(1023)
40 
41 # 输出响应的数据, bytes 类型
42 print('响应', response)
43 # 转成 str 再输出
44 print('响应的 str 格式', response.decode('utf-8'))

 

// 服务端代码实例

 1 import socket
 2 
 3 
 4 # 这个程序就是一个套路程序, 套路程序没必要思考为什么会是这样
 5 # 记住套路, 能用, 就够了
 6 # 运行这个程序后, 浏览器打开 localhost:2000 就能访问了
 7 #
 8 # 服务器的 host 为空字符串, 表示接受任意 ip 地址的连接
 9 # post 是端口, 这里设置为 2000, 随便选的一个数字
10 host = ''
11 port = 2000
12 
13 # s 是一个 socket 实例
14 s = socket.socket()
15 # s.bind 用于绑定
16 # 注意 bind 函数的参数是一个 tuple
17 s.bind((host, port))
18 
19 
20 # 用一个无限循环来处理请求
21 while True:
22     # 套路, 先要 s.listen 开始监听
23     # 注意 参数 5 的含义不必关心
24     s.listen(5)
25     # 当有客户端过来连接的时候, s.accept 函数就会返回 2 个值
26     # 分别是 连接 和 客户端 ip 地址
27     connection, address = s.accept()
28 
29     # recv 可以接收客户端发送过来的数据
30     # 参数是要接收的字节数
31     # 返回值是一个 bytes 类型
32     request = connection.recv(1024)
33 
34     # bytes 类型调用 decode('utf-8') 来转成一个字符串(str)
35     print('ip and request, {}\n{}'.format(address, request.decode('utf-8')))
36 
37     # b'' 表示这是一个 bytes 对象
38     response = b'<h1>Hello World!</h1>'
39     # 用 sendall 发送给客户端
40     connection.sendall(response)
41     # 发送完毕后, 关闭本次连接
42     connection.close()

 

目录
相关文章
|
5月前
|
前端开发 API UED
Python后端与前端交互新纪元:AJAX、Fetch API联手,打造极致用户体验!
Python后端与前端交互新纪元:AJAX、Fetch API联手,打造极致用户体验!
142 2
|
4月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
215 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
4月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
243 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
4月前
|
前端开发 API 开发者
深度剖析:AJAX、Fetch API如何成为Python后端开发者的最佳拍档!
深度剖析:AJAX、Fetch API如何成为Python后端开发者的最佳拍档!
60 4
|
4月前
|
数据可视化 测试技术 Linux
基于Python后端构建多种不同的系统终端界面研究
【10月更文挑战第10天】本研究探讨了利用 Python 后端技术构建多样化系统终端界面的方法,涵盖命令行界面(CLI)、图形用户界面(GUI)及 Web 界面。通过分析各种界面的特点、适用场景及关键技术,展示了如何使用 Python 标准库和第三方库(如 `argparse`、`click`、`Tkinter` 和 `PyQt`)实现高效、灵活的界面设计。旨在提升用户体验并满足不同应用场景的需求。
|
4月前
|
JavaScript Java API
探索后端技术:构建高效、可靠的服务端应用
本文将深入探讨后端开发的关键概念和技巧,旨在帮助读者理解如何构建高效、可靠的服务端应用。通过阐述常见的后端技术和框架,以及实际应用中的注意事项,我们将一步步揭示后端开发的精髓,助力你在技术领域迈向新的高度。
|
5月前
|
关系型数据库 MySQL Python
mysql之python客户端封装类
mysql之python客户端封装类
|
5月前
|
SQL 缓存 数据库
探索后端技术:构建高效、可靠的服务端应用
本文将深入探讨后端开发中的几个关键技术点,包括框架选择、数据库设计、接口安全性和性能优化。通过分析每个方面的重要性和实施策略,我们希望为后端开发人员提供一些有价值的指导和最佳实践,帮助他们构建高效、可靠和安全的服务端应用。
30 1
|
4月前
|
前端开发 API 数据格式
颠覆传统!AJAX、Fetch API与Python后端,开启Web开发新篇章!
在Web开发领域,技术的快速迭代推动着应用不断进化。传统前后端交互方式已无法满足现代Web应用对高效、实时性和用户体验的需求。AJAX作为异步通信的先驱,使页面无需刷新即可更新部分内容,显著提升用户体验;尽管XML曾是其主要数据格式,但如今JSON已成为主流。Fetch API则以其简洁、灵活的特点成为AJAX的现代替代品,基于Promises的异步请求让开发更加高效。与此同时,Python后端凭借高效稳定和丰富的库支持,成为众多开发者的首选,无论是轻量级的Flask还是全功能的Django,都能为Web应用提供强大的支撑。
54 0
|
4月前
|
XML 前端开发 API
惊艳全场的秘诀!AJAX、Fetch API与Python后端,打造令人惊叹的Web应用!
惊艳全场的秘诀!AJAX、Fetch API与Python后端,打造令人惊叹的Web应用!
50 0

热门文章

最新文章