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

news2024/11/25 5:27:32

一.网络编程

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)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot+微信小程序的点餐系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 小程序外卖扫码点餐为…

【MQTT】关于部署含有MQTT协议的程序pod到K8S中出现的问题

1、如何在go-zero整合MQTT协议 整合EMQX与eclipse/paho.mqtt.golang实现TLS&#xff08;ssl&#xff09;单向认证 订阅、发布、解压缩gzip、zlib数据报文 https://ctraplatform.blog.csdn.net/article/details/130525974 1.1 、通过钩子函数一直出现Lost问题排查 场景&#xff…

人类睡眠EEG分析:附代码实现的方法学入门

导读 近年来&#xff0c;人类睡眠脑电图(EEG)研究激增&#xff0c;采用了越来越复杂的分析策略将电生理活动与认知和疾病联系起来。然而&#xff0c;正确计算和解释当代睡眠EEG中使用的指标需要注意许多理论和实际的信号处理细节。本研究回顾了与频谱分析、蒙太奇选择、相位和…

VC GDI双缓冲绘图

VC GDI双缓冲绘图 VC GDI双缓冲绘图创建内存DC和内存图片&#xff0c;缺一不可最好是封装一下内存绘制绘制效果 关键是不闪烁PS 重绘机制 VC GDI双缓冲绘图 双缓冲绘图&#xff0c;知道这个知识点&#xff0c;每次用的时候还得踩一遍坑&#xff0c;真是服&#xff0c;总结记录…

BGP实验--联邦以及反射器

实验明细 实验拓扑实验要求实验内容 实验拓扑 实验要求 1.R2-R7每台路由器均存在一个环回接口用于建立邻居&#xff1b;同时还存在一个环回来代表连接用户的接口&#xff1b;最终这些连接用户的接口网络需要可以和R1/8的环回通讯 2.AS2网段地址为172.16.0.0/16&#xff0c;减少…

【开源项目】ShenYu网关中Disruptor的使用

模块封装 shenyu-disruptor定义了DisruptorProvider、DisruptorProviderManage、DataEvent、QueueConsumerFactory、DisrutporThreadFactory等一系列通用接口 该模块的搭建了一个disruptor的初始化框架&#xff0c; DisruptorProviderManage提供Disruptor的初始化&#xff0c;…

分布式事务的21种武器 - 4

在分布式系统中&#xff0c;事务的处理分布在不同组件、服务中&#xff0c;因此分布式事务的ACID保障面临着一些特殊难点。本系列文章介绍了21种分布式事务设计模式&#xff0c;并分析其实现原理和优缺点&#xff0c;在面对具体分布式事务问题时&#xff0c;可以选择合适的模式…

软件设计师数据结构速过

加法规则&#xff1a;多项相加&#xff0c;保留最高阶项&#xff0c;并将系数化为 1 乘法规则&#xff1a;多项相乘都保留&#xff0c;并将系数化为 1 加法乘法混合规则&#xff1a;先小括号再乘法规则最后加法规则 时间复杂度估算看最内层循环&#xff0c;如若没有循环和递归则…

终于!我们把 CEO 炒了,让 ChatGPT 出任 CEO

⚠️ FBI Warning&#xff1a;本文纯属作者自娱自乐&#xff0c;数字人的观点不代表 CEO 本人的观点&#xff0c;请大家不要上当受骗&#xff01;&#xff01; 哪个公司的 CEO 不想拥有一个自己的数字克隆&#xff1f; 想象&#x1f914;一下&#xff0c;如果 CEO 数字克隆上线…

【初识django】——django——如桃花来

目录索引 django引入&#xff1a;常见的web框架&#xff1a;下载问题&#xff1a;*下载Django之前确保工具不会发生版本问题*下载django:*检查是否下载成功&#xff1a;**注意事项&#xff1a;* 创建django项目&#xff1a;在cmd中创建&#xff1a;*整个命令流程&#xff1a;**…

React学习笔记六-refs

此文章是本人在学习React的时候&#xff0c;写下的学习笔记&#xff0c;在此纪录和分享。此为第六篇&#xff0c;主要介绍react中的refs。 目录 1.refs基本使用 1.1字符串类型ref小案例 2.回调形式的ref 2.1回调形式ref小案例 2.2回调ref中调用次数问题 3.createRef 3.…

SpringBoot 插件 spring-boot-maven-plugin 原理,以及SpringBoo工程部署的 jar 包瘦身实战

spring-boot-maven-plugin 我们直接使用 maven package &#xff08;maven自带的package打包功能&#xff09;&#xff0c;打包Jar包的时候&#xff0c;不会将该项目所依赖的Jar包一起打进去&#xff0c;在使用java -jar命令启动项目时会报错&#xff0c;项目无法正常启动。这…

TOP RPA·脱普×实在丨日用品企业脱普签约实在智能,构建全域数据智能运营系统

近日&#xff0c;实在智能与脱普日用化学品&#xff08;中国&#xff09;有限公司&#xff08;简称“脱普企业”&#xff09;在脱普企业上海总部举行“全域数据智能运营”项目启动会&#xff0c;双方领导及项目组关键成员共同参会&#xff0c;就项目目标、实施进程、沟通机制等…

Spring Boot中使用Spring Data Elasticsearch访问Elasticsearch

Spring Boot中使用Spring Data Elasticsearch访问Elasticsearch Elasticsearch是一个分布式的全文搜索和分析引擎&#xff0c;它可以将海量数据进行快速的查询和聚合。Spring Data Elasticsearch是Spring Data家族中的一个成员&#xff0c;它提供了与Elasticsearch的集成&…

一起来学习怎样识别表格文件吧

你有没有经历过手头有一堆纸质表格&#xff0c;但是又不想手动输入数据的烦恼&#xff1f;现在&#xff0c;表格识别计数的出现&#xff0c;可以帮助你轻松解决这个问题。它通过拍照扫描&#xff0c;来自动提取表格中的信息&#xff0c;并将其转化为可编辑的电子文档。那么&…

c# 动态表达式

准备&#xff1a; 创建一个空项目&#xff0c;nuget查找并安装ExpressionEvaluator 示例&#xff1a; using ExpressionEvaluator; using System; 一、计算简单表达式 public string Test1() { return SimpleEval("0.1*(Math.Pow(10,2)20)"); …

AI小作文搞崩科大讯飞股价 科技“魔法”反噬科企

5月24日午后&#xff0c;A股公司科大讯飞的股价突然走出深V造型&#xff0c;闪崩8%。科大讯飞回应称&#xff0c;股价下跌系某生成式AI写作虚假小作文导致&#xff0c;谣传风险为不实消息。 网传的一篇“小作文”谣称“科大讯飞被曝采集用户隐私数据研究人工智能引发争议”&am…

Windows下编写的shell脚本无法在Linux上执行

这通常是由于回车换行符不兼容导致的。 出现无法执行&#xff0c;提示诸如“ 未预期的符号“$\r”附近有语法错误”&#xff0c;“syntax error near unexpected token in”之类的错误&#xff0c;可尝试此文方法。 1.查看shell脚本的换行符格式 vi/vim进入文件&#xff0c;…

2023年湖北建筑起重信号司索工报名流程是什么?个人可以报名吗?

2023年湖北建筑起重信号司索工报名流程是什么&#xff1f;个人可以报名吗&#xff1f; 建筑起重信号司索工是特种作业人员工种即是建设厅特种工。证书全国通用&#xff0c;两年需要年审一次&#xff0c;六年需要换一次证。报考有一定的条件和要求。搜一下启程别就知道啦。 湖北…

【Leetcode】697. 数组的度

[哈希表] Given a non-empty array of non-negative integers nums, the degree of this array is defined as the maximum frequency of any one of its elements. Your task is to find the smallest possible length of a (contiguous) subarray of nums, that has the sa…