• python 网络编程和http协议--网络编程,HTTP协议,Web服务器


    一.网络编程

    1.IP地址

    • 给网络中的每一台设备进行编号.

    • IPV4

    • IPV6

    2.端口和端口号

    • 端口的作用就是给运行的应用程序提供传输数据的通道

    • 端口号的作用是用来区分和管理不同端口的,通过端口号能找到唯一个的一个端口

    3.TCP协议

    • 协议: 双方的约定.

    • 网络传输协议: 基于网络传输数据格式而产生的约定.

    • TCP协议: 它是一种面向连接的、可靠的、基于字节流的传输层通信协议

    • TCP 是一个稳定、可靠的传输协议,常用于对数据进行准确无误的传输,比如: 文件下载,浏览器上网

    4.socket

     

    5.TCP服务端编程流程

     

    6.TCP协议编程

    1. import socket
    2. # 创建服务端端套接字对象
    3. # 参数1: ‘AF_INET’, 表示IPv4地址类型
    4. # 参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
    5. # server_socket = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
    6. server_socket = socket.socket()#使用默认参数
    7. # 绑定端口号 参数: 元组, 比如:(ip地址, 端口号)
    8. server_socket.bind(('127.0.0.1',6666))
    9. # 设置监听
    10. server_socket.listen(128)
    11. # 等待接受客户端的连接请求 有返回值.accept() -> (socket object, address info)
    12. socket,address = server_socket.accept()# 阻塞
    13. print(socket)#
    14. print(address)#('127.0.0.1', 6050)
    15. # 接收数据 --- 阻塞 -> bytes
    16. bytes_data = socket.recv(1024)#阻塞
    17. # 发送数据
    18. # str.encode(编码格式) 表示把字符串编码成为二进制
    19. # data.decode(编码格式) 表示把二进制解码成为字符串
    20. print(f"接收客户发来的数据:{bytes_data.decode('UTF-8')}")
    21. # 关闭套接字
    22. socket.close()#关闭通道
    23. server_socket.close()#关闭服务器

    7.TCP编程聊天软件(单聊)

    1. import socket
    2. # 创建服务端端套接字对象
    3. # 参数1: ‘AF_INET’, 表示IPv4地址类型
    4. # 参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
    5. # server_socket = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
    6. server_socket = socket.socket()#使用默认参数
    7. # 绑定端口号 参数: 元组, 比如:(ip地址, 端口号)
    8. server_socket.bind(('127.0.0.1',6666))
    9. # 设置监听
    10. server_socket.listen(128)
    11. # 等待接受客户端的连接请求 有返回值.accept() -> (socket object, address info)
    12. socket,address = server_socket.accept()# 阻塞
    13. print(socket)#
    14. print(address)#('127.0.0.1', 6050)
    15. while True:
    16.    # 接收数据 --- 阻塞 -> bytes
    17.    bytes_data = socket.recv(1024)#阻塞
    18.    # str.encode(编码格式) 表示把字符串编码成为二进制
    19.    # data.decode(编码格式) 表示把二进制解码成为字符串
    20.    print(f"接收客户发来的数据:{bytes_data.decode('UTF-8')}")
    21.    # 发送数据
    22.    #准备数据.字节数据.
    23.    str_input = input('请输入给客户的话:exit退出\r\n')
    24.    if str_input == 'exit':
    25.        # 关闭套接字
    26.        socket.close()  # 关闭通道
    27.        server_socket.close()  # 关闭服务器
    28.        break#停止循环
    29.    b_data = str_input.encode("utf-8")
    30.    socket.send(b_data)

    8.TCP编程聊天软件(多聊)

    1. import socket
    2. import threading
    3. def chat(socket, address):
    4.    while True:
    5.        # 接收数据 --- 阻塞 -> bytes
    6.        bytes_data = socket.recv(1024)  # 阻塞
    7.        # str.encode(编码格式) 表示把字符串编码成为二进制
    8.        # data.decode(编码格式) 表示把二进制解码成为字符串
    9.        print(f"接收{address}发来的数据:{bytes_data.decode('UTF-8')}")
    10.        # 发送数据
    11.        # 准备数据.字节数据.
    12.        str_input = input('请输入给客户的话:exit退出\r\n')
    13.        if str_input == 'exit':
    14.            # 关闭套接字
    15.            socket.close()  # 关闭通道
    16.            break#结束循环
    17.        b_data = str_input.encode("utf-8")
    18.        socket.send(b_data)
    19. if __name__ == '__main__':
    20.    # 创建服务端端套接字对象
    21.    # 参数1: ‘AF_INET’, 表示IPv4地址类型
    22.    # 参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
    23.    # server_socket = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
    24.    server_socket = socket.socket()#使用默认参数
    25.    # 绑定端口号 参数: 元组, 比如:(ip地址, 端口号)
    26.    server_socket.bind(('127.0.0.1',6666))
    27.    # 设置监听
    28.    server_socket.listen(128)
    29.    while True:
    30.        # 等待接受客户端的连接请求 有返回值.accept() -> (socket object, address info)
    31.        socket,address = server_socket.accept()# 阻塞
    32.        print(socket)#
    33.        print("欢迎连接服务器:",address)#('127.0.0.1', 6050)
    34.        #开启线程 一个线程服务一个聊天.
    35.        threading.Thread(target=chat,args=(socket,address)).start()
    36. # server_socket.close() # 关闭服务器

    二.HTTP协议

    7.HTTP协议

    • 超文本传输协议

    • 规定了浏览器和 Web 服务器通信数据的格式,也就是说浏览器和web服务器通信需要使用http协议

    8.URL

    • URL的英文全拼是(Uniform Resoure Locator),表达的意思是统一资源定位符,通俗理解就是网络资源地址,也就是我们常说的网址。

    • URL组成部分 

      • 协议部分: https://、http://、ftp://

      • 域名部分: news.163.com

      • 资源路径部分: /18/1122/10/E178J2O4000189FH.html

      •  

    9.HTTP请求部分

     

    10.HTTP相应部分

     

    三.Web服务器

    11.socket编写web服务器

    1. import socket
    2. # 创建服务端端套接字对象
    3. # 参数1: ‘AF_INET’, 表示IPv4地址类型
    4. # 参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
    5. # server_socket = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
    6. server_socket = socket.socket()#使用默认参数
    7. # 绑定端口号 参数: 元组, 比如:(ip地址, 端口号)
    8. server_socket.bind(('127.0.0.1',9999))
    9. # 设置监听
    10. server_socket.listen(128)
    11. # 等待接受客户端的连接请求 有返回值.accept() -> (socket object, address info)
    12. socket,address = server_socket.accept()# 阻塞
    13. print(socket)#
    14. print(address)#('127.0.0.1', 6050)
    15. # 接收数据 --- 阻塞 -> bytes
    16. bytes_data = socket.recv(1024)#阻塞
    17. # str.encode(编码格式) 表示把字符串编码成为二进制
    18. # data.decode(编码格式) 表示把二进制解码成为字符串
    19. request_data = bytes_data.decode('UTF-8')
    20. print(f"接收客户发来的数据:{request_data}")
    21. #解析客户端http数据 --"大的字符串"--拆分字符串
    22. req_line = request_data.split('\r\n')[0]#GET /login?user=admin&pwd=123 HTTP/1.1
    23. #对请求行进行拆分
    24. req_path = req_line.split()[1] # /login?user=admin&pwd=123
    25. # 省略了判断用户名和密码是否正确>>>
    26. # 发送数据 http数据
    27. #准备数据.字节数据
    28. # 响应行
    29. response_line = "HTTP / 1.1 200 OK\r\n"
    30. # 响应头
    31. response_header = "Server: Tengine\r\n"
    32. # 响应体
    33. response_body = "

      登录成功

      "
    34. # 组成响应报文
    35. response_data = response_line + response_header + "\r\n" + response_body
    36. socket.send(response_data.encode('gbk'))

    12.web服务器返回HTML页面

    1. import socket
    2. # 创建服务端端套接字对象
    3. # 参数1: ‘AF_INET’, 表示IPv4地址类型
    4. # 参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
    5. # server_socket = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
    6. server_socket = socket.socket()#使用默认参数
    7. # 绑定端口号 参数: 元组, 比如:(ip地址, 端口号)
    8. server_socket.bind(('127.0.0.1',9999))
    9. # 设置监听
    10. server_socket.listen(128)
    11. # 等待接受客户端的连接请求 有返回值.accept() -> (socket object, address info)
    12. socket,address = server_socket.accept()# 阻塞
    13. print(socket)#
    14. print(address)#('127.0.0.1', 6050)
    15. # 接收数据 --- 阻塞 -> bytes
    16. bytes_data = socket.recv(1024)#阻塞
    17. # str.encode(编码格式) 表示把字符串编码成为二进制
    18. # data.decode(编码格式) 表示把二进制解码成为字符串
    19. request_data = bytes_data.decode('UTF-8')
    20. print(f"接收客户发来的数据:{request_data}")
    21. #解析客户端http数据 --"打的字符串"--拆分字符串
    22. req_line = request_data.split('\r\n')[0]#GET /login?user=admin&pwd=123 HTTP/1.1
    23. #对请求行进行拆分
    24. req_path = req_line.split()[1] # /login?user=admin&pwd=123
    25. # 判断用户名和密码是否正确>>>
    26. # 发送数据 http数据
    27. #准备数据.字节数据
    28. # 响应行
    29. response_line = "HTTP / 1.1 200 OK\r\n"
    30. # # 响应头
    31. response_header = "Server: Tengine\r\n"
    32. # 响应体--html页面
    33. file = open("login.html",'r',encoding='utf-8')
    34. #读取html文件所有的数据
    35. html_data = file.read()
    36. file.close() #关闭资源
    37. # 组成响应报文
    38. response_data = response_line + response_header + "\r\n" + html_data
    39. socket.send(response_data.encode('utf-8'))
     
    

    13.FastAPI服务器框架

    1. import uvicorn
    2. from fastapi import FastAPI
    3. #初始化 FastAPI 框架
    4. from fastapi import Response
    5. app = FastAPI()
    6. #编写函数--处理浏览器请求
    7. @app.get("/login.html")
    8. def login():
    9. file = open("login.html",encoding='utf-8')
    10. str_data = file.read()
    11. return Response(content=str_data,media_type='text/html')
    12. #编写函数--处理浏览器请求
    13. @app.get("/regist.html")
    14. def regist():
    15. file = open("regist.html",encoding='utf-8')
    16. str_data = file.read()
    17. return Response(content=str_data,media_type='text/html')
    18. #启动服务器,绑定端口
    19. uvicorn.run(app,host='127.0.0.1',port=9999)

  • 相关阅读:
    GnosisSafe.sol 学习 (一)
    从底层结构开始学习FPGA----Xilinx ROM IP的定制与测试
    外包干了5天,技术退步明显。。。。。
    C# NModbus4 TCP 主从站通信样例
    机器人控制器编程实践指导书旧版-实践八 机器人综合设计
    企业实施ERP系统遇到的问题及应对措施
    CLION openCL C/C++环境配置(两个坑)
    【云原生】Nacos-TaskManager 任务管理的使用
    基于SSM+Vue论坛发布系统-Java新闻博客论坛系统代码
    Linux操作系统基础 – 正则表达式快速入门
  • 原文地址:https://blog.csdn.net/Clittle225/article/details/130859354