网址组成(四部分)

协议      http, https(https 是加密的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-65535(2**16)

——HTTP协议——

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

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

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

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

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

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

1,请求行或者响应行

2,Header(请求的
Header

Host
字段是必须的,其他都是可选)

3,\r\n\r\n(连续两个换行回车符,用来分隔Header和Body)

4,Body(可选)

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

原始数据如下

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

打印出来如下

GET
/ HTTP/1.1

Host:
g.cn

其中

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

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

3,HTTP/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部分太长,先不贴了

其中响应行(第一行):

1,HTTP/1.1
是版本

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

3,Moved
Permanently 是状态码的描述

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

——web服务器做什么——

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

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

// 客户端代码实例:

 # coding: utf-8

 import socket

 # socket 是操作系统用来进行网络通信的底层方案
# 简而言之, 就是发送 / 接收数据 # 创建一个 socket 对象
# 参数 socket.AF_INET 表示是 ipv4 协议
# 参数 socket.SOCK_STREAM 表示是 tcp 协议
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 这两个其实是默认值, 所以你可以不写, 如下
# s = socket.socket()
# s = ssl.wrap_socket(socket.socket()) # 主机(域名或者ip)和端口
host = 'g.cn'
port = 80
# 用 connect 函数连接上主机, 参数是一个 tuple
s.connect((host, port)) # 连接上后, 可以通过这个函数得到本机的 ip 和端口
ip, port = s.getsockname()
print('本机 ip 和 port {} {}'.format(ip, port)) # 构造一个 HTTP 请求
http_request = 'GET / HTTP/1.1\r\nhost:{}\r\n\r\n'.format(host)
# 发送 HTTP 请求给服务器
# send 函数只接受 bytes 作为参数
# str.encode 把 str 转换为 bytes, 编码是 utf-8
request = http_request.encode('utf-8')
print('请求', request)
s.send(request) # 接受服务器的响应数据
# 参数是长度, 这里为 1023 字节
# 所以这里如果服务器返回的数据中超过 1023 的部分你就得不到了
response = s.recv(1023) # 输出响应的数据, bytes 类型
print('响应', response)
# 转成 str 再输出
print('响应的 str 格式', response.decode('utf-8'))

// 服务端代码实例

 import socket

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

Python后端(一)——客户端/服务端的更多相关文章

  1. [并发并行]_[线程模型]_[Pthread线程使用模型之三 客户端/服务端模型(Client/Server]

    Pthread线程使用模型之三 客户端/服务端模型(Client/Server) 场景 1.在客户端/服务端模型时,客户端向服务端请求一些数据集的操作. 服务端执行执行操作独立的(多进程或跨网络)– ...

  2. win10操作系统下oracle11g客户端/服务端的下载安装配置卸载总结

    win10操作系统下oracle11g客户端/服务端的下载安装配置卸载总结 一:前提 注意:现在有两种安装的方式 1. oracle11g服务端(64位)+oracle客户端(32位)+plsql(3 ...

  3. cocos2d-lua ARPG手机游戏《烈焰遮天》(客户端+服务端+数据库)发布说明

    服务器发布流程及其规范1,环境准备        a, mvn命令行:从\\10.21.210.161\share\tools\apache-maven-3.1.1-bin.tar.gz取出安装包,  ...

  4. 转:: 刺鸟:用python来开发webgame服务端(5)

    来源:http://ciniao.me/article.php?id=19 --------------- 刺鸟原创文章,转载请注明出处    在前面的文章中,我们已经开始了不少逻辑功能的开发,在这期 ...

  5. 转:: 刺鸟:用python来开发webgame服务端(4)

    来源:http://ciniao.me/article.php?id=14 --------------- 刺鸟原创文章,转载请注明出处    前面的工作都已准备就绪,现在我们得来看看服务端怎么和客户 ...

  6. 转:: 刺鸟:用python来开发webgame服务端(3)

    来源:http://ciniao.me/article.php?id=11 --------------- 刺鸟原创文章,转载请注明出处    在之前的准备工作中,我们已经建立了一个socket服务器 ...

  7. 转:: 刺鸟:用python来开发webgame服务端(2)

    来源:http://ciniao.me/article.php?id=10 --------------- 刺鸟原创文章,转载请注明出处    就在刚才,我们用基于python下的Twisted库写了 ...

  8. 转:: 刺鸟:用python来开发webgame服务端(1)

    来源:http://ciniao.me/article.php?id=9 --------------- 刺鸟原创文章,转载请注明出处    在开始之前,先简单描述一下项目的特点:我要实现的是一个mm ...

  9. tcp文件下载客户端+服务端

    客户端: import socket if __name__ == '__main__': # 创建tcp客户端socket tcp_client_socket = socket.socket(soc ...

随机推荐

  1. 如何在同一台机器上安装多个MySQL的实例

    转自:'http://www.cnblogs.com/shangzekai/p/4375271.html 最近由于工作的需要,需要在同一台机器上搭建两个MySQL的实例,(注:已经存在了一个3306的 ...

  2. scrapy_简介页面和详情页面

    如何对提取的URL进行限定? 往上找id和class属性值,进行多次层级选择,进行内容限定 如何实现获取主页所有urls,然后交给scrapy下载后并解析详情页面,返回结果?(文章简介页面和文章详细页 ...

  3. 02_HTML5+CSS详解第三天

    WebStorage简单的网页留言板用到的函数有3个1.saveStorage函数使用"new Date().getTime()"语句来获取当前的日期和时间戳,然后使用localS ...

  4. 【转】AWK常用

    awk是个优秀文本处理工具,可以说是一门程序设计语言.下面是awk内置变量. 一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个字段,字段间由FS分隔 FS 输入 ...

  5. struts2.xml的配置问题

    1.<package namespace="/"></package> namespace决定访问action的路径: 如果省略,将代表任意路径: 2.&l ...

  6. 蓝桥杯练习系统— 算法训练 Beaver's Calculator

    问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator 1.0".它非常特别,并且被计划使用在各种各样 ...

  7. MySql-5.7.17-20解压缩版安装配置

    MySql-5.7.XXX解压缩版安装配置   1.mysql-5.7.20是解压版免安装的,版本下载地址:http://dev.mysql.com/downloads/mysql/ 如下图 2.解压 ...

  8. rabbitmq的构架和原理(三)

    前面两篇博文已经将环境安装和相关配置介绍了,现在开始正式学习rabbitmq的使用了: rabbitMQ的构架 rabbitmq作为消息队列,一条消息从发布到订阅消费的完整流程为: 消息 --> ...

  9. CRM项目-1模型与站点管理

    一.项目环境 语言:python3 IDE:pycharm 组件:bootstarp,jQuery 二.模型 2.1编写模型 联合唯一 class Meta:显示中文名. 认证使用django自带的U ...

  10. ABP官方文档翻译 6.1.1 MVC控制器

    ASP.NET MVC控制器 介绍 AbpController基类 本地化 其他 过滤器 异常处理和结果包装 审计日志 验证 授权 工作单元 介绍 ABP通过Abp.Web.Mvc nuget包集成到 ...