zoukankan      html  css  js  c++  java
  • Python后端(一)——客户端/服务端

    网址组成(四部分)

        协议      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 (连续两个换行回车符,用来分隔HeaderBody

    4Body(可选)


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

    原始数据如下

    'GET / HTTP/1.1 host:g.cn '

    打印出来如下

    GET / HTTP/1.1

    Host: g.cn


    其中

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

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

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


    具体字符串是'GET / HTTP/1.1 host:g.cn '



    返回的数据如下

    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
    host:{}
    
    '.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, {}
    {}'.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()
  • 相关阅读:
    Ch1 机器学习基础
    信息论与编码课程设计
    实验4 数据库的安全性、完整性
    实验3 SQL语言—更新操作、视图、索引等操作
    实验2 SQL语言—SELECT查询操作
    实验1 数据库的定义和建立实验
    计算机网络|网络层作业
    信息安全从业者书单推荐
    jenkins异常 -- active (exited),无法启动
    性能测试 -- docker部署grafana
  • 原文地址:https://www.cnblogs.com/LexMoon/p/DpythonWeb.html
Copyright © 2011-2022 走看看