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

一.网络编程

1.IP地址

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

  • IPV4

  • IPV6

2.端口和端口号

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

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

3.TCP协议

  • 协议: 双方的约定.

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

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

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

4.socket

 

5.TCP服务端编程流程

 

6.TCP协议编程

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

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

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

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

import socket
import threading
def chat(socket, address):
    while True:
        # 接收数据 --- 阻塞 -> bytes
        bytes_data = socket.recv(1024)  # 阻塞
        # str.encode(编码格式) 表示把字符串编码成为二进制
        # data.decode(编码格式) 表示把二进制解码成为字符串
        print(f"接收{address}发来的数据:{bytes_data.decode('UTF-8')}")
​
        # 发送数据
        # 准备数据.字节数据.
        str_input = input('请输入给客户的话:exit退出\r\n')
        if str_input == 'exit':
            # 关闭套接字
            socket.close()  # 关闭通道
            break#结束循环
​
        b_data = str_input.encode("utf-8")
        socket.send(b_data)
​
if __name__ == '__main__':
    # 创建服务端端套接字对象
    # 参数1: ‘AF_INET’, 表示IPv4地址类型
    # 参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
    # server_socket = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
    server_socket = socket.socket()#使用默认参数
    # 绑定端口号 参数: 元组, 比如:(ip地址, 端口号)
    server_socket.bind(('127.0.0.1',6666))
    # 设置监听
    server_socket.listen(128)
    while True:
        # 等待接受客户端的连接请求 有返回值.accept() -> (socket object, address info)
        socket,address = server_socket.accept()# 阻塞
        print(socket)#<socket.socket fd=396, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6666), raddr=('127.0.0.1', 6050)>
        print("欢迎连接服务器:",address)#('127.0.0.1', 6050)
        #开启线程 一个线程服务一个聊天.
        threading.Thread(target=chat,args=(socket,address)).start()
​
​
​
 # 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服务器

import socket
# 创建服务端端套接字对象
# 参数1: ‘AF_INET’, 表示IPv4地址类型
# 参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
# server_socket = socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
server_socket = socket.socket()#使用默认参数
# 绑定端口号 参数: 元组, 比如:(ip地址, 端口号)
server_socket.bind(('127.0.0.1',9999))
# 设置监听
server_socket.listen(128)
# 等待接受客户端的连接请求 有返回值.accept() -> (socket object, address info)
socket,address = server_socket.accept()# 阻塞
print(socket)#<socket.socket fd=396, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 6666), raddr=('127.0.0.1', 6050)>
print(address)#('127.0.0.1', 6050)
​
# 接收数据 --- 阻塞 -> bytes
bytes_data = socket.recv(1024)#阻塞
# str.encode(编码格式) 表示把字符串编码成为二进制
# data.decode(编码格式) 表示把二进制解码成为字符串
request_data = bytes_data.decode('UTF-8')
print(f"接收客户发来的数据:{request_data}")
​
#解析客户端http数据 --"大的字符串"--拆分字符串
req_line = request_data.split('\r\n')[0]#GET /login?user=admin&pwd=123 HTTP/1.1
#对请求行进行拆分
req_path = req_line.split()[1] # /login?user=admin&pwd=123
​
# 省略了判断用户名和密码是否正确>>>
​
# 发送数据 http数据
#准备数据.字节数据
# 响应行
response_line = "HTTP / 1.1 200 OK\r\n"
# 响应头
response_header = "Server: Tengine\r\n"
# 响应体
response_body = "<h1>登录成功</h1>"
# 组成响应报文
response_data = response_line + response_header + "\r\n" + response_body
​
socket.send(response_data.encode('gbk'))

12.web服务器返回HTML页面

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

13.FastAPI服务器框架

import uvicorn
from fastapi import FastAPI
#初始化 FastAPI 框架
from fastapi import Response

app = FastAPI()


#编写函数--处理浏览器请求
@app.get("/login.html")
def login():
   file =  open("login.html",encoding='utf-8')
   str_data = file.read()
   return Response(content=str_data,media_type='text/html')

#编写函数--处理浏览器请求
@app.get("/regist.html")
def regist():
   file =  open("regist.html",encoding='utf-8')
   str_data = file.read()
   return Response(content=str_data,media_type='text/html')


#启动服务器,绑定端口
uvicorn.run(app,host='127.0.0.1',port=9999)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/24556.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码线程安全

线程生命周期 synchronized synchronized会自动释放锁 synchronized同步代码块 synchronized后面括号里obj是锁对象(保证唯一)&#xff1b;static修饰的obj对象是自定义MyThread线程类的静态成员变量&#xff0c;该自定义线程类所有实例共享保证锁对象唯一性&#xff1b;另一…

博客系统的后端设计(八) - 实现发布博客功能

文章目录 发布博客1. 约定前后端交互接口2. 服务器代码3. 客户端代码4. 出现的问题 发布博客 在原来的编辑页面点击发布文章按钮&#xff0c;是不会有什么效果的。 这是因为此时还不能实现前后端的交互。 1. 约定前后端交互接口 请求使用 POST&#xff0c;路径是 /blog title这…

Niagara—— Niagara Editor界面

目录 一&#xff0c;菜单栏 二&#xff0c;工具栏 三&#xff0c;预览面板 四&#xff0c;参数面板 五&#xff0c;系统总览面板 六&#xff0c;暂存区面板 七&#xff0c;选择面板 八&#xff0c;时间轴面板 九&#xff0c;曲线面板 十&#xff0c;日志面板 十一&a…

通过js来判断是否是横屏如果是就自刷新页面解决横屏之后只有屏幕一半宽度的问题

判断页面是横屏还是竖屏 window.addEventListener("load", rotate, false);window.addEventListener("onorientationchange" in window ? "orientationchange" : "resize", rotate, false);function rotate() {if (window.orientatio…

力扣高频SQL50题(基础版)——第一天

力扣高频SQL50题(基础版)——第一天 1 可回收且低脂的产品 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # WHERE子句中使用多条件 SELECT product_id FROM Products WHERE low_fatsY AND recyclableY1.3 运行截图 2 寻找用户推荐人 2.1 题目内容…

《数据库应用系统实践》------ 小区停车管理系统

系列文章 《数据库应用系统实践》------ 小区停车管理系统 文章目录 系列文章一、需求分析1、系统背景2、 系统功能结构&#xff08;需包含功能结构框图和模块说明&#xff09;3&#xff0e;系统功能简介 二、概念模型设计1&#xff0e;基本要素&#xff08;符号介绍说明&…

第13届蓝桥杯Scratch选拔赛真题集锦

第13届蓝桥杯Scratch选拔赛真题集锦 编程题 第 1 题问答题 跳舞机游戏 题目说明 编程实现 跳舞机游戏。 具体要求: 1).点击绿旗,舞台左上角显示得分0代表玩家分数,在得分右侧倒计时10代表游戏时长(10s) 2).游戏开始倒数计时,在舞台上随机显示上、下、左、右四个箭头中…

SCMA基本原理介绍

SCMA: Sparse Code Multiple Access SCMA基本原理 我们考虑一个同步&#xff08;synchronous&#xff09;的SCMA系统&#xff0c; 含1个基站&#xff08;Base Station, BS&#xff09;&#xff1b; J J J个用户&#xff08;so called layers&#xff09;&#xff1b;K个OFDM…

vue2介绍(入门)

目录 声明式渲染 v-bind v-if条件与循环 name命名 学会log打印 一些js方法 双向绑定v-model和v-bind 那么请实现一个复选框吧 自定义标签模板 声明式渲染 我感觉这里文档的意思是双向绑定&#xff0c; 或许需要清理一下js缓存机制 &#xff0c;嗯...不懂,响应式&…

深入解析Linux C/C++ 编程中的内存泄漏问题

深入解析Linux C/C 编程中的内存泄漏问题 I. 前言 (Introduction)1.1 文章目的与内容概述 (Purpose and Overview of the Content)1.2 重要性和实用性的说明 (Significance and Practicality Explanation)1.3 数据结构与内存泄漏的基本概念 (Basic Concepts of Data Structure …

PDF文件数字证书签名指南

一、安装PDF证书的环境 1.1 PDF证书安装环境 Windows pc 机一台 安装Adobe Acrobat 软件 PDF文档签名证书一张(备注&#xff1a;本指南使用沃通内部文档加密证书进行操作,通用其它版本证书) 1.2 网络环境要求 请确保您签名的电脑可以正常访问外网。 二、PDF证书安装 2.…

数据结构之二叉树的基本实现

在我们之前已经了解的堆这样的完全二叉树的实现&#xff0c;也对树型结构有了一些了解&#xff0c;那么今天我们来看看二叉树的一些性质。 因为二叉树是一种每个节点至多只有两个子树&#xff08;即二叉树的每个节点的度不大于2&#xff09;&#xff0c;并且二叉树的子树有左右…

Shell脚本攻略:shell函数应用

目录 一、理论 1.shell函数 2.函数传参 3.函数变量的作用范围 4.递归 5.函数位置变量与脚本位置变量区别 6.创建库 二、实验 1.实验一 一、理论 1.shell函数 &#xff08;1&#xff09;概念 将命令序列按格式写在一起&#xff0c;可方便重复使用命令序列。 ① 避免…

Docker容器与虚拟机(VM)大对比

Docker是一个开源应用容器引擎。Docker可以将应用程序与基本架构分开&#xff0c;从而快速交付软件。 传统虚拟机的运行需要占用较高的资源&#xff0c;包括磁盘空间、内存和处理器性能。每个虚拟机都需要完整的操作系统和应用程序副本&#xff0c;这在资源利用和启动时间上存…

js实现PDF 预览和文件下载

在开发过程中要求对 PDF 类型的发票提供 预览 和 下载 功能&#xff0c;PDF 类型文件的来源又包括 H5 移动端 和 PC 端&#xff0c;而针对这两个不同端的处理会有些许不同&#xff0c;下文会有所提及。 针对 PDF 预览 的文章不在少数&#xff0c;但似乎都没有提及可能遇到的问…

Markdown可以在线编辑吗?这个办法很好用

Markdown是一种轻量级标记语言&#xff0c;它使用简单的语法来创建文本&#xff0c;非常易于学习。它最初被设计为一种用于写作的格式&#xff0c;但现在已经成为了一种非常受欢迎的文本编辑工具。 作为一个较为方便的在线文本编辑器&#xff0c;它可以用代码代替文字&#xf…

27事务管理AOP

一、MySQL事务回顾 二、Spring事务管理 Spring框架的第一大核心&#xff1a;IOC控制反转 在DeptServiceImpl下删除部门方法下新加一个删除员工信息的操作&#xff0c;注意&#xff1a;此时的id是部门id。 1、问题分析 2、Transactional-Spring事务管理 一般是在Service实现类的…

Visual Studio内引用Lua解释器,编译Lua源码,执行Lua脚本

前言 本篇在讲什么 在Visual Studio中引入lua的解释器 使用C调用Lua文件 本篇适合什么 适合初学Lua的小白 适合需要C/C和lua结合开发的人 本篇需要什么 对Lua语法有简单认知 对C/C语法有简单认知 依赖Lua5.1的环境 依赖VS 2017编辑器 本篇的特色 具有全流程的图文…

springboot中将logback切换为log4j2

前言 springboot默认使用logback作为日志记录框架&#xff0c;常见的日志记录框架有log4j、logback、log4j2。这篇文章我们来学习怎样将logbak替换为log4j2。 一、为什么使用log4j2&#xff1f; 我们在项目中经常使用一个叫SLF4J的依赖&#xff0c;它是做什么的呢&#xff1f; …

Activity的预览窗口StartingWindow添加

Activity的预览窗口StartingWindow添加 1、Activity组件启动2、ActivityStarter.java#startActivityInner() > 主要查看Task.java#startActivityLocked3、ActivityRecord.java#addStartingWindow到WindowManagerService.java#addWindow3.1 ActivityRecord.java#addStartingW…