Python实现Web请求与响应

news2025/5/23 7:31:59

目录

一、Web 请求与响应基础

(一)Web 请求与响应的定义与组成

(二)HTTP 协议概述

(三)常见的 HTTP 状态码

二、Python 的 requests 库

(一)安装 requests 库

(二)发送 GET 请求

(三)发送 POST 请求

(四)处理响应头和状态码

(五)发送带查询参数的 GET 请求

(六)发送带表单数据的 POST 请求

三、处理 JSON 响应

四、文件操作

(一)打开文件的模式

(二)读取文件

(三)写入文件

(四)下载文件示例

(五)文件操作中的注意事项

(六)其他常用文件操作

五、错误处理与异常捕获

(一)try 语句的使用

(二)示例:捕获常见异常

(三)异常处理总结

六、try语句

(一) 基本语法与结构

(二)捕获多种异常

( 三)捕获所有异常

(四)主动抛出异常(raise)

(五)自定义异常

(六)异常链(raise ... from)

( 七)上下文管理器(with 语句)

(八) 常见异常类型

(九)最佳实践

(十)异常处理流程

(十一) 高级用法:try-except-else-finally 组合

(十二)异常与性能


一、Web 请求与响应基础

(一)Web 请求与响应的定义与组成

Web 请求与响应是 Web 通信的基础,其中 Web 请求由客户端发起,服务器处理后返回响应。

  1. Web 请求的组成

    • 请求行:包含请求方法(如 GET、POST、PUT、DELETE 等)、URL 以及 HTTP 协议版本(如 HTTP/1.1)。例如,一个 GET 请求的请求行可能是 “GET /index.html HTTP/1.1”。
    • 请求头:包含关于客户端信息、请求体类型、浏览器类型等元数据。常见的请求头有 User - Agent(用于标识客户端类型)、Content - Type(表示请求体的数据类型)等。
    • 请求体:在 POST 请求中通常包含用户提交的数据,如表单数据或文件等,而 GET 请求一般没有请求体。
  2. Web 响应的组成

    • 响应行:包括 HTTP 协议版本、状态码和状态消息。例如 “HTTP/1.1 200 OK”,其中 200 是状态码,OK 是状态消息。
    • 响应头:包含关于响应的信息,如内容类型(Content - Type)、服务器信息(Server)等。
    • 响应体:包含实际返回的数据,可能是 HTML 页面、JSON 数据等。

(二)HTTP 协议概述

HTTP(Hypertext Transfer Protocol)是 Web 上传输数据的协议,负责浏览器与服务器之间的通信。以下是常见的 HTTP 方法:

  • GET:请求服务器获取资源,通常用于读取数据,其特点是请求参数会附加在 URL 后面,以 “?” 分隔,多个参数用 “&” 连接。例如 “https://example.com/search?keyword=python”。
  • POST:提交数据到服务器,通常用于表单提交、文件上传等,数据通过请求体传输,不会显示在 URL 中,相对更安全。
  • PUT:用于更新服务器上的资源。
  • DELETE:用于删除服务器上的资源。

(三)常见的 HTTP 状态码

  • 200 OK:表示请求成功,服务器返回所请求的数据。
  • 301 Moved Permanently:表示资源已永久移动,客户端会自动重定向到新的 URL。
  • 404 Not Found:表示请求的资源不存在。
  • 500 Internal Server Error:表示服务器内部错误。

二、Python 的 requests 库

(一)安装 requests 库

在使用 requests 库之前,需要先进行安装。如果你的系统中已经安装了 Python 的包管理工具 pip,可以通过以下命令在命令行中安装:

pip install requests

(二)发送 GET 请求

GET 请求通常用于获取数据,我们可以通过 requests.get () 方法来发送 GET 请求,并处理返回的响应。以下是一个简单的示例代码:

import requests

# 发送GET请求
response = requests.get("https://www.example.com")

# 输出响应的状态码
print("Status Code:", response.status_code)

# 输出响应的内容
print("Response Body:", response.text)

# 输出响应头
print("Response Headers:", response.headers)

# 获取响应内容的长度
print("Content Length:", len(response.text))

代码解释

  • requests.get()用于发送 GET 请求,括号内传入要请求的 URL,该方法会返回一个 Response 对象,包含了服务器返回的所有信息。
  • response.status_code用于获取 HTTP 响应状态码,通过该状态码可以判断请求是否成功。
  • response.text用于获取响应的正文内容,通常是 HTML 或 JSON 数据,返回的是字符串类型。
  • response.headers用于获取响应头,它是一个类似字典的对象,可以通过键来访问相应的值。
  • len(response.text)用于返回响应正文的长度,通过该值可以帮助我们了解返回内容的大小。

(三)发送 POST 请求

POST 请求用于将数据提交到服务器,通常用于表单提交或上传文件等场景,我们使用 requests.post () 方法来发送 POST 请求。以下是示例代码:

import requests

# 发送POST请求
url = "https://httpbin.org/post"
data = {"name": "Alice", "age": 25}
response = requests.post(url, data=data)

# 输出响应状态码
print("Status Code:", response.status_code)

# 输出响应内容(JSON格式)
print("Response Body:", response.json())

代码解释

  • requests.post()用于发送 POST 请求,第一个参数是 URL,第二个参数 data 是一个字典,包含了要提交的数据。requests 库会自动将其编码为application/x-www-form-urlencoded格式。
  • response.json()用于解析返回的 JSON 数据,它会将 JSON 格式的响应内容转换为 Python 的字典或列表等数据结构,方便我们进行处理。

(四)处理响应头和状态码

响应头提供了关于服务器的信息,状态码则告诉我们请求是否成功。我们可以通过以下代码来获取响应头和状态码:

import requests

# 发送GET请求
response = requests.get("https://www.example.com")

# 获取响应头
print("Response Headers:", response.headers)

# 获取响应状态码
print("Status Code:", response.status_code)

# 获取内容类型
print("Content - Type:", response.headers.get("Content - Type"))

代码解释

  • response.headers返回响应头,其中包含了如 Content - Type、Date、Server 等信息,我们可以通过字典的 get () 方法来获取指定键的值,如获取内容类型。
  • response.status_code返回 HTTP 状态码,通过判断该状态码是否为 200 等成功状态码,可以确定请求是否成功执行。

(五)发送带查询参数的 GET 请求

在 GET 请求中,我们可以通过 URL 传递查询参数。例如,访问一个包含参数的 URL,我们可以通过 requests.get () 方法的 params 参数来传递查询参数。以下是示例代码:

import requests

# 发送带查询参数的GET请求
url = "https://httpbin.org/get"
params = {"name": "Alice", "age": 25}
response = requests.get(url, params=params)

# 输出响应内容
print("Response Body:", response.json())

代码解释

  • params是一个字典,包含了要传递的查询参数。requests.get () 方法会自动将这些参数编码到 URL 中,生成的 URL 类似于 “https://httpbin.org/get?name=Alice&age=25”。

(六)发送带表单数据的 POST 请求

POST 请求可以用来提交表单数据,以下是使用 requests 发送带表单数据的 POST 请求的示例代码:

import requests

# 发送带表单数据的POST请求
url = "https://httpbin.org/post"
data = {"username": "testuser", "password": "mypassword"}
response = requests.post(url, data=data)

# 输出响应的内容
print("Response Body:", response.json())

代码解释

  • data参数是一个字典,包含了表单提交的数据,requests 库会自动将数据编码为application/x-www-form-urlencoded格式,该格式是表单数据提交的常见格式。

三、处理 JSON 响应

许多 Web API 返回的数据格式是 JSON,Python 的 requests 库提供了方便的 JSON 处理方法。以下是示例代码:

import requests

# 发送GET请求并获取JSON响应
url = "https://api.github.com/users/octocat"
response = requests.get(url)

# 解析JSON数据
data = response.json()

# 输出用户的GitHub信息
print("User Login:", data["login"])
print("User Name:", data["name"])

代码解释

  • response.json()方法会将响应的内容解析为 Python 字典,这样我们就可以像操作普通字典一样方便地处理 JSON 数据,通过键来获取相应的值。

四、文件操作

(一)打开文件的模式

Python 使用内置的 open () 函数来打开文件,打开文件时需要指定文件模式(即操作文件的方式)。以下是常见的文件打开模式:

  1. 只读模式(r):默认模式,文件必须存在。如果文件不存在,会抛出 FileNotFoundError 异常。
  2. 写入模式(w):如果文件存在,会覆盖文件内容;如果文件不存在,会创建新文件。
  3. 追加模式(a):如果文件存在,写入的数据会追加到文件末尾;如果文件不存在,会创建新文件。
  4. 独占创建模式(x):若文件已存在,操作会失败并抛出 FileExistsError 异常,此模式通常用于创建文件时防止覆盖现有文件。
  5. 二进制读取模式(rb):用于读取非文本文件(如图片、音频文件)。
  6. 二进制写入模式(wb):用于写入非文本文件。
  7. 读写模式(+):文件必须存在,既可以读取文件内容,也可以写入数据。
  8. w + 模式:读写模式,如果文件存在,会覆盖文件内容;如果文件不存在,会创建新文件。
  9. a + 模式:读写模式,文件存在时,数据会追加到文件末尾;如果文件不存在,会创建新文件。
  10. rb + 模式:二进制读写模式。

以下是使用不同模式打开文件的示例代码:

# 以只读模式打开文件
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)

# 以写入模式打开文件,文件内容会被覆盖
with open('example.txt', 'w') as file:
    file.write("这是新的文件内容。\n")

# 以追加模式打开文件,新的内容会追加到文件末尾
with open('example.txt', 'a') as file:
    file.write("追加的内容。\n")

# 以二进制模式打开文件(例如读取图片)
with open('image.jpg', 'rb') as file:
    binary_data = file.read()
    print("读取到的二进制数据:", binary_data[:20])

(二)读取文件

Python 中的文件读取功能非常强大,以下是几种常见的读取方式:

  1. read () 方法:用于读取文件中的所有内容,读取后的内容会作为字符串返回。示例代码如下:
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)
  1. readline () 方法:每次读取一行文件内容,适用于需要逐行处理文件的情况。示例代码如下:
with open('example.txt', 'r') as file:
    line = file.readline()
    while line:
        print(line.strip())  # strip()用来去除行末的换行符
        line = file.readline()

  1. readlines () 方法:会一次性读取文件中的所有行,并将每行数据存储为一个列表的元素,适用于需要读取整个文件并进行行处理的情况。示例代码如下:
with open('example.txt', 'r') as file:
    lines = file.readlines()
    for line in lines:
        print(line.strip())

(三)写入文件

Python 提供了几种方法将数据写入文件,写入操作常用于日志记录、数据导出等场景。

  1. 使用 write () 方法写入文件:该方法将指定的字符串写入文件。若文件以 “w” 模式打开,原文件内容会被覆盖;若以 “a” 模式打开,内容会被追加到文件末尾。示例代码如下:
with open('output.txt', 'w') as file:
    file.write("这是第一行数据。\n")
    file.write("这是第二行数据。\n")

  1. 使用 writelines () 方法写入多行数据:该方法接受一个可迭代对象(如列表、元组等),将其元素写入文件中,每个元素将作为一行写入文件。示例代码如下:
lines = ["第一行数据。\n", "第二行数据。\n", "第三行数据。\n"]
with open('output.txt', 'w') as file:
    file.writelines(lines)

(四)下载文件示例

我们可以通过 requests 库来下载文件,并将其保存到本地。以下是下载一个图片文件的示例代码:

import requests

url = "https://www.example.com/image.jpg"  # 图片URL
response = requests.get(url)

# 检查请求是否成功
if response.status_code == 200:
    # 使用二进制模式写入文件
    with open('downloaded_image.jpg', 'wb') as file:
        file.write(response.content)
    print("图片下载成功!")
else:
    print(f"下载失败,状态码:{response.status_code}")

代码解释

  • 首先使用 requests.get () 方法发送 GET 请求获取图片文件的内容,设置 URL 为图片的地址。
  • 通过判断响应的状态码是否为 200,来确定请求是否成功。
  • 如果请求成功,使用 with open () 语句以二进制写入模式('wb')打开文件,然后通过 file.write (response.content) 将响应的内容(二进制数据)写入文件中。response.content 返回的是字节流数据,适合用于处理二进制文件。

(五)文件操作中的注意事项

  1. 文件是否存在:在打开文件时,必须确保文件路径正确。如果文件不存在,可以使用 os.path.exists () 函数检查文件是否存在,或者使用 try - except 语句捕获 FileNotFoundError 异常。示例代码如下:
import os

if os.path.exists('example.txt'):
    with open('example.txt', 'r') as file:
        content = file.read()
else:
    print("文件不存在!")

  1. 文件权限:在操作文件时,可能会遇到权限不足的问题。例如,尝试写入只读文件,或访问没有读取权限的文件。在这种情况下,可以使用 try - except 语句来捕获 PermissionError 异常。示例代码如下:
try:
    with open('readonly_file.txt', 'w') as file:
        file.write("尝试写入只读文件")
except PermissionError:
    print("权限不足,无法写入文件。")

  1. 文件自动关闭:使用 with open () 语句时,Python 会自动管理文件的打开和关闭,无需显式调用 file.close () 方法,这有助于避免文件未关闭的问题,减少资源泄漏的风险。

(六)其他常用文件操作

  1. 获取文件信息:Python 提供了 os 和 os.path 模块,可以获取文件的大小、修改时间等信息。示例代码如下:
import os

file_path = 'example.txt'
print("文件大小:", os.path.getsize(file_path), "字节")
print("文件修改时间:", os.path.getmtime(file_path))

  1. 删除文件:使用 os.remove () 函数可以删除文件。示例代码如下:
import os

file_path = 'example.txt'
if os.path.exists(file_path):
    os.remove(file_path)
    print(f"{file_path}已删除!")
else:
    print("文件不存在!")

五、错误处理与异常捕获

在进行 Web 请求时,可能会发生各种错误,例如网络超时、服务器错误等。requests 库通过异常处理机制帮助我们捕获这些错误,Python 的 try 语句能够捕获和处理代码块中的异常,从而避免程序崩溃,并且提供了处理错误的机会。

(一)try 语句的使用

try 语句用于捕获和处理异常,它由以下三部分组成(其中 else 块和 finally 块可选):

  • try 块:包含可能会引发异常的代码。当代码运行过程中发生错误时,程序会跳到相应的 except 块进行处理。
  • except 块:当 try 块中的代码出现异常时,程序会跳转到 except 块执行。在 except 中可以指定要捕获的异常类型,如 Timeout、HTTPError 等。
  • else 块(可选):如果 try 块中的代码没有抛出异常,则会执行 else 块中的代码。
  • finally 块(可选):无论是否发生异常,finally 块中的代码都会执行,通常用于清理资源(如关闭文件、数据库连接等)。

(二)示例:捕获常见异常

以下是捕获常见异常的示例代码:

import requests
from requests.exceptions import RequestException, Timeout, HTTPError

try:
    # 发送GET请求,并设置超时时间为5秒
    response = requests.get("https://www.example.com", timeout=5)

    # 如果状态码不是200,抛出HTTPError异常
    response.raise_for_status()  # 如果状态码是4xx或5xx,抛出异常

    # 如果请求成功,则输出响应内容
    print("Response Body:", response.text)

# 捕获请求超时异常
except Timeout:
    print('Request timed out')

# 捕获HTTP错误(如状态码404、500等)
except HTTPError as http_err:
    print(f'HTTP error occurred: {http_err}')

# 捕获其他网络相关的错误
except RequestException as req_err:
    print(f'Request error occurred: {req_err}')

# 可以在finally块中清理资源(如关闭文件或连接)
finally:
    print("Request attempt completed.")

代码解释

  • try 块:首先发起 HTTP 请求,通过 timeout=5 参数设置超时时间为 5 秒。然后使用 response.raise_for_status () 方法来检查响应的状态码,如果服务器返回了错误的状态码(如 404、500 等,即 4xx 或 5xx 的状态码),该方法会抛出 HTTPError 异常。如果如果状态码为 200 等成功状态码,则执行后续的打印响应内容的操作。
  • except 块

    • Timeout:当请求超时(超过设置的 5 秒)时,程序会捕获到 Timeout 异常,并打印 “Request timed out”,提示用户请求超时。
    • HTTPError:若响应的状态码表明出现 HTTP 错误(例如 404 表示未找到页面,500 表示服务器内部错误等),程序会捕获到 HTTPError 异常,并打印相关错误信息,如 “HTTP error occurred: 404 Client Error: Not Found for url: https://www.example.com”,其中包含具体的错误状态码和错误描述,方便用户了解出错原因。
    • RequestException:该异常是所有 requests 库异常的基类,可以捕获任何 requests 库抛出的异常,例如连接问题、DNS 解析失败等。当发生其他网络相关错误时,程序会捕获到 RequestException 异常,并打印 “Request error occurred: [具体错误信息]”,让用户知晓发生了网络请求相关的错误。
  • finally 块:其中的代码无论是否发生异常都会被执行,这里仅打印 “Request attempt completed.”,用于表示请求的结束,通常在此处可以进行一些资源清理工作,如关闭文件、数据库连接等,确保程序的资源得到合理释放。

(三)异常处理总结

  • 避免程序崩溃:异常处理机制让我们在程序运行中能够捕获到错误并做出相应处理,避免程序因为遇到异常而突然崩溃,提高了程序的稳定性和可靠性。
  • 精确处理异常:通过 try...except 结构,可以根据不同的异常类型进行精确的捕获和处理,针对不同的错误情况执行不同的处理逻辑,使程序能够更灵活地应对各种异常情况。例如,对于超时异常可以重新发起请求,对于 HTTP 错误可以提示用户检查请求的 URL 是否正确等。
  • 资源清理:finally 块用于执行清理工作,无论是否发生异常,都会在请求处理完成后执行其中的代码,确保资源(如文件句柄、网络连接等)能够被正确释放,避免资源泄漏问题的发生,这对于长时间运行的程序尤为重要。

六、try语句

(一) 基本语法与结构

try:
    # 可能引发异常的代码块
    result = 10 / 0  # 除零错误
except ZeroDivisionError as e:
    # 捕获特定异常并获取错误对象
    print(f"错误: {e}")  # 输出: division by zero
else:
    # 仅在 try 块无异常时执行
    print("计算成功:", result)
finally:
    # 无论是否异常都执行(常用于资源清理)
    print("执行完毕")

(二)捕获多种异常

1 .分别处理不同异常

try:
    num = int("abc")  # ValueError
    result = 10 / num  # ZeroDivisionError
except ValueError:
    print("输入不是有效整数")
except ZeroDivisionError:
    print("除数不能为零")

2 .合并处理同类异常

try:
    file = open("nonexistent.txt")  # FileNotFoundError
    data = json.load(file)  # JSONDecodeError
except (FileNotFoundError, json.JSONDecodeError) as e:
    print(f"文件错误: {e}")

( 三)捕获所有异常

⚠️ 不推荐滥用,可能掩盖严重问题:

try:
    # 任意代码
except Exception as e:
    print(f"未知错误: {e}")
    # 推荐记录堆栈信息用于调试
    import traceback
    print(traceback.format_exc())

(四)主动抛出异常(raise

def validate_age(age):
    if age < 0:
        raise ValueError("年龄不能为负数")
    return age

try:
    validate_age(-5)
except ValueError as e:
    print(e)  # 输出: 年龄不能为负数

(五)自定义异常

class AuthError(Exception):
    """自定义认证错误"""
    def __init__(self, message="认证失败"):
        self.message = message
        super().__init__(self.message)

# 使用示例
try:
    if not user_authenticated():
        raise AuthError("无效令牌")
except AuthError as e:
    print(f"认证异常: {e}")

(六)异常链(raise ... from

保留原始异常信息,便于定位问题:

try:
    data = json.loads("invalid json")
except json.JSONDecodeError as e:
    raise RuntimeError("配置解析失败") from e

输出:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
json.JSONDecodeError: Expecting value...

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
RuntimeError: 配置解析失败

( 七)上下文管理器(with 语句)

替代 try-finally 进行自动资源管理:

try:
    with open("data.txt", "r") as file:
        content = file.read()
except FileNotFoundError:
    print("文件不存在")
# 文件会自动关闭,无需手动调用 file.close()

(八) 常见异常类型

异常类型触发场景
ZeroDivisionError除零错误
TypeError类型不匹配(如字符串 + 整数)
ValueError值不符合预期(如 int("abc")
FileNotFoundError文件不存在
KeyError字典键不存在
IndexError索引越界
PermissionError权限不足
TimeoutError操作超时

(九)最佳实践

1 .精确捕获异常

try:
    result = 10 / num
except (ZeroDivisionError, TypeError) as e:
    print(f"计算错误: {e}")

2 .使用 logging 记录异常

import logging

try:
    # 危险操作
except Exception as e:
    logging.error(f"系统异常: {e}", exc_info=True)

3 .自定义异常分层

class AppError(Exception):
    """应用基础异常"""

class DatabaseError(AppError):
    """数据库操作异常"""

class ConnectionError(DatabaseError):
    """连接异常"""

4 .资源清理优先用 with

# 不推荐
file = open("data.txt")
try:
    data = file.read()
finally:
    file.close()

# 推荐
with open("data.txt") as file:
    data = file.read()

(十)异常处理流程

  1. 执行 try 块:若有异常,跳转到第一个匹配的 except
  2. 匹配 except:按顺序检查,找到则执行对应代码块
  3. 执行 else:若 try 无异常
  4. 执行 finally:无论是否异常,最终执行

(十一) 高级用法:try-except-else-finally 组合

try:
    # 尝试操作
    file = open("config.json", "r")
except FileNotFoundError:
    # 处理缺失配置
    print("使用默认配置")
    config = DEFAULT_CONFIG
else:
    # 无异常时读取配置
    try:
        config = json.load(file)
    except json.JSONDecodeError:
        print("配置格式错误,使用默认值")
        config = DEFAULT_CONFIG
    finally:
        file.close()  # 确保文件关闭
finally:
    # 应用配置
    apply_config(config)

(十二)异常与性能

  • 异常处理本身不慢,但频繁抛出 / 捕获会影响性能
  • 避免用异常控制常规流程(如循环读取文件)
  • 优先使用条件判断(如 if os.path.exists(file)

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

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

相关文章

机器学习 day05

文章目录 前言一、模型选择与调优1.交叉验证2.超参数搜索 前言 通过今天的学习&#xff0c;我掌握了机器学习中模型的选择与调优&#xff0c;包括交叉验证&#xff0c;超参数搜索的概念与基本用法。 一、模型选择与调优 模型的选择与调优有许多方法&#xff0c;这里主要介绍较…

C#新建打开文件对话框

这是Winform直接封装好的打开文件对话框 using System.Windows.Forms; public static string OpenFile(string path) {OpenFileDialog openFileDialog new OpenFileDialog();// 设置对话框属性openFileDialog.Title "选择文件";openFileDialog.InitialDirectory …

汇川PLC通过开疆智能Profinet转ModbusTCP网关读取西门子PLC数据案例

本案例是客户通过开疆智能Profient转ModbusTCP网关连接汇川PLC的配置案例 Modbus TCP主站即Modbus TCP客户端&#xff0c;Modbus TCP主站最多支持同时与31个Modbus TCP从站 。&#xff08;Modbus TCP服务器&#xff09;进行通信。 第一步设置PLC IP地址&#xff1b; 默认PLC…

零基础入门:MinerU 和 PyTorch、CUDA的关系

&#x1f4a1;一句话总结&#xff1a;MinerU 是一个用 PyTorch 跑模型的程序&#xff0c;PyTorch 支持多种加速方式&#xff08;如 CUDA、MPS&#xff09;&#xff0c;让它跑得快就需要依赖这些加速工具。 PyTorch官网安装教程&#xff08;可根据系统情况选择不同版本&#xf…

借助IEDA ,Git版本管理工具快速入门

01 引言 一直使用SVN作为版本管理工具&#xff0c;直到公司新来的一批同事&#xff0c;看到我们使用的SVN都纷纷吐槽&#xff0c;什么年代了&#xff0c;还使用SVN。聊下来&#xff0c;才知道人家公司早早就将SVN切成了Git工具&#xff0c;并吐槽SVN的各种弊端。 既然新的技术…

三维空间,毫秒即达:RTMP|RTSP播放器在Unity中的落地实现

有人问我&#xff1a;在 Unity 里做超低延迟的直播播放&#xff0c;是什么感觉&#xff1f; 我说&#xff0c;是把一帧帧流动的时间&#xff0c;嵌进一个三维的空间里。 它不属于现在&#xff0c;也不属于过去。 它属于“实时”——属于那一秒内刚刚发生&#xff0c;却已被你看…

ubuntu 搭建FTP服务,接收部标机历史音视频上报服务器

1.安装vsftpd 1.1.安装命令 sudo apt update sudo apt install vsftpd 1.2.备份原始配置文件 sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak 1.3.配置 vsftpd 编辑配置文件 /etc/vsftpd.conf&#xff1a; sudo vim /etc/vsftpd.conf 将以下参数修改为对应值&#xff…

一、内存调优

一、内存调优 什么是内存泄漏 监控Java内存的常用工具 内存泄露的常见场景 内存泄露的解决方案 内存泄露与内存溢出的区别 内存泄露&#xff1a;在Java中如果不再使用一个对象&#xff0c;但是该对象依然在GC ROOT的引用链上&#xff0c;这个对象就不会被垃圾回收器回收&…

Java的Filter与Spring的Interceptor的比较

一、技术规范与框架依赖 维度FilterInterceptor所属规范Servlet 规范&#xff08;Java EE 标准组件&#xff09;Spring MVC 框架组件&#xff08;非 Java EE 标准&#xff09;框架依赖不依赖 Spring&#xff0c;仅需 Servlet 容器&#xff08;如 Tomcat&#xff09;依赖 Sprin…

WPF···

设置启动页 默认最后一个窗口关闭,程序退出,可以设置 修改窗体的icon图标 修改项目exe图标 双击项目名会看到代码 其他 在A窗体点击按钮打开B窗体,在B窗体设置WindowStartupLocation=“CenterOwner” 在A窗体的代码设置 B.Owner = this; B.Show(); B窗体生成在A窗体中间…

微服务架构中的多进程通信--内存池、共享内存、socket

目录 1 引言 2 整体架构简介 3 疑问 3.1 我们的共享内存消息机制是用的posix还是system V 3.2 rmmt中&#xff0c;不同线程之间的比如访问同一个内存&#xff0c;用的什么锁控制的 3.3 疑问&#xff1a;假如一个进程发送给了另外两个进程&#xff0c;然后另外两个进程都同…

电脑中所有word文件图标变白怎么恢复

电脑中的word文件图标变白&#xff0c;如下图所示&#xff1a; 解决方法&#xff1a; 1.winR-->在弹出的运行窗口中输入“regedit”(如下图所示)&#xff0c;点击确定&#xff1a; 2.按照路径“计算机\HKEY_CLASSES_ROOT\Word.Document.12\DefaultIcon”去找到“&#xff0…

RK3568 OH5.1 源码编译及问题

安装编译器和二进制工具 在源码根目录下执行prebuilts脚本&#xff0c;安装编译器及二进制工具。 bash build/prebuilts_download.sh在源码根目录执行如下指令安装hb编译工具&#xff1a; python3 -m pip install --user build/hb使用build.sh脚本编译源码 进入源码根目录&…

Qt5、C++11 获取wifi列表与wifi连接

一、获取wifi列表 .h 文件内容 #include <QWidget> #include <QVBoxLayout> #include <QPushButton> #include <QCheckBox> #include <QListWidget>class Setting : public QWidget {Q_OBJECT public:explicit Setting(QWidget *parent nul…

【KWDB 2025 创作者计划】_从部署开始了解KWDB

一、概述 KaiwuDB 是一款面向 AIoT 场景的分布式、多模融合、支持原生 AI 的数据库产品&#xff0c;支持同一实例同时建立时序库和关系库并融合处理多模数据&#xff0c;具备时序数据高效处理能力&#xff0c;具有稳定安全、高可用、易运维等特点。面向工业物联网、数字能源、…

高等数学-微分

一、一元函数&#xff1a; 在实际应用中&#xff0c;经常需要近似计算函数yf(x)的增量Δyf(x)-f(x0)f(x0Δx)-f(x0),其中一种近似称为函数的微分。 定义&#xff1a;若函数yf(x)在点x0处的增量Δy可表达为自变量增量Δx的线性函数AΔx和Δx的高阶无穷小量之和&#xff0c;即Δ…

有没有开源的企业网盘,是否适合企业使用?

开源选项丰富、灵活定制能力强、需要额外运维投入、适合特定场景但不一定适合所有企业&#xff0c;是开源企业网盘的主要特征。从表面看&#xff0c;开源网盘往往具有免费或低成本优势&#xff0c;但企业要投入一定的人力与技术资源来完成安装、维护与升级&#xff0c;从而保障…

基于系统整合的WordPress个性化配置方法深度解析:从需求分析到实现过程

文章目录 引言一、理解WordPress页面与文章的区别二、主题与模板层级&#xff1a;自定义的基础三、自定义页面模板&#xff1a;打造专属页面风格四、自定义文章模板&#xff1a;打造个性化文章呈现五、使用自定义字段和元数据&#xff1a;增强内容灵活性六、利用WordPress钩子&…

使用pm2 部署react+nextjs项目到服务器

记录一下 next.config.js中&#xff1a; output: standalone,package.json配置&#xff1a; "scripts": {"dev": "cross-env NODE_OPTIONS--inspect next dev","build": "next build","start": "cp -r .nex…

JVM常量池(class文件常量池,运行时常量池,字符串常量池)

文章目录 问题JVM运行时数据区JVM中的常量池Class文件常量池运行时常量池字符串常量池创建了几个对象String的定义intern()问题 超过1W字深度剖析JVM常量池&#xff08;全网最详细最有深度&#xff09; - 跟着Mic学架构 - 博客园 问题 jdk1.8之后 元空间是独立存在的&#xf…