【100天精通python】Day46:python网络编程基础与入门

目录

专栏导读 

1 网络编程的基础

2. 基本概念和协议

2.1 计算机网络基础

2.2 网络协议、IP地址、端口号

2.3  常见网络协议

3. 套接字编程

3.1 套接字的基本概念

3.2 套接字的基本操作

3.3 套接字通信模型和方法:send、recv

3.3.1 TCP通信模型

3.3.2 UDP通信模型

4. 客户端-服务器模型

4.1 客户端的角色

4.2  服务器的角色

4.3 客户端-服务器的交互

4.4 创建简单的客户端和服务器通信示例:

5. WebSocket编程

6. 异步编程和多线程

7. 数据安全和加密

7.1 数据加密与隐私保护

7.2 输入验证和过滤

7.3 防范跨站脚本攻击(XSS)

7.4 防范SQL注入

   7.5 安全更新和漏洞修复

8. 身份验证和授权

8.1 用户身份验证的方法和技术

8.2 实现用户登录和访问控制

8.3 使用JWT进行身份验证


 专栏导读 

专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html


 

1 网络编程的基础

        网络编程是指利用计算机网络在不同计算机之间进行数据交换和通信的过程。它涵盖了多个层次,从底层的数据传输、协议交互到高层的应用程序开发。

  1. 协议(Protocol): 协议是规定计算机之间通信方式的一套规则和标准。网络通信必须遵循特定的协议,以确保数据正确地在发送和接收之间传输。常见的网络协议包括TCP、UDP、HTTP、HTTPS、FTP、SMTP等。

  2. IP地址(IP Address): IP地址是用于在网络上标识计算机和设备的唯一地址。IP地址分为IPv4和IPv6两种版本。IPv4地址是由四个用点分隔的十进制数字组成(例如:192.168.0.1),而IPv6地址使用更长的十六进制数字串。

  3. 端口号(Port Number): 端口号用于标识计算机上不同应用程序的通信通道。一个IP地址可以有多个端口,每个端口对应一个应用程序。端口号是一个16位的整数,范围从0到65535。

  4. 套接字(Socket): 套接字是网络通信的基本操作接口,它用于在计算机之间建立连接并传输数据。套接字包括IP地址、协议和端口号,通过它可以实现不同计算机之间的通信。

  5. 客户端(Client)和服务器(Server): 客户端是发起网络请求的计算机或应用程序,服务器是接收和处理这些请求的计算机或应用程序。客户端发送请求,服务器响应并提供相应的服务。

  6. HTTP(Hypertext Transfer Protocol): HTTP是一种用于在Web上传输数据的协议,它基于客户端-服务器模型。客户端发送HTTP请求,服务器返回HTTP响应。HTTP支持GET、POST、PUT、DELETE等请求方法。

  7. TCP(Transmission Control Protocol): TCP是一种面向连接的协议,它提供可靠的数据传输和错误校验。TCP通过建立连接、数据分割和重新组装,确保数据按顺序、无丢失地传输。

  8. UDP(User Datagram Protocol): UDP是一种无连接的协议,它不提供数据传输的可靠性和错误校验,但速度较快。UDP适用于实时通信,如音频和视频传输。

  9. 数据包(Packet): 数据在网络上以数据包的形式传输。每个数据包包含有关数据的信息,例如源IP地址、目标IP地址、端口号等。数据包可能在传输过程中被分割、重新排序或重传。

  10. 域名(Domain Name): 域名是人类可读的网址,用于标识网站或服务器。域名通过DNS解析为IP地址,使用户可以使用易记的域名访问网站。

  11. DNS(Domain Name System): DNS是一个分布式数据库系统,将域名映射到IP地址,以便计算机可以在互联网上定位其他计算机。它允许使用人类可读的域名来访问资源。

        网络编程在现代计算机世界中扮演着重要的角色,它支持了互联网、Web应用、实时通信、分布式系统等多个领域。

2. 基本概念和协议

2.1 计算机网络基础

         计算机网络是多台计算机和设备通过通信链路相互连接,共享资源和信息的集合。网络可以分为局域网(LAN)、广域网(WAN)、互联网等。网络提供了远程通信、资源共享、数据传输等功能。

2.2 网络协议、IP地址、端口号

  • 网络协议: 网络协议是规定计算机之间通信的一套规则和标准。它定义了数据格式、通信流程、错误处理等。常见的网络协议有TCP、UDP、HTTP、HTTPS、FTP、SMTP等。
  • IP地址(Internet Protocol Address): IP地址用于标识计算机和设备在网络中的唯一位置。IPv4使用32位二进制数表示(例如:192.168.0.1),而IPv6使用128位十六进制数。
  • 端口号(Port Number): 端口号用于标识计算机上不同应用程序的通信通道。它是一个16位的整数,范围从0到65535。TCP和UDP使用端口号来将数据传递给正确的应用程序。

2.3  常见网络协议

  • TCP(Transmission Control Protocol): TCP是一种面向连接的协议,提供可靠的数据传输和错误检测。它将数据切割成小块(数据段)进行传输,并确保数据按序到达,适用于重要数据的传输,如文件传输、电子邮件等。

  • UDP(User Datagram Protocol): UDP是一种无连接的协议,不提供可靠性和错误检测。它将数据切割成数据报进行传输,适用于实时通信,如音频、视频传输和在线游戏。

  • HTTP(Hypertext Transfer Protocol): HTTP用于在Web上传输超文本文档,如网页。它是一种无状态的协议,客户端发送请求,服务器返回响应。HTTP常用于浏览器和Web服务器之间的通信。

  • HTTPS(Hypertext Transfer Protocol Secure): HTTPS是加密的HTTP协议,通过SSL/TLS协议对通信进行加密,保护数据的隐私和完整性。它用于安全的Web通信,如在线支付、敏感数据传输等。

3. 套接字编程

        套接字编程是网络编程中的核心,用于实现计算机之间的数据传输和通信。下面详细解释套接字的基本概念、操作以及通信模型和方法。

3.1 套接字的基本概念

        套接字(Socket)是一种抽象的通信端点,通过套接字,不同计算机之间可以进行数据交换。套接字提供了网络通信的基本接口,其中包含了目标IP地址、协议和端口号等信息。套接字通常分为两种类型:流套接字(TCP)和数据报套接字(UDP)。

3.2 套接字的基本操作

包括创建、绑定、监听和接受连接。

创建套接字: 使用socket库创建一个套接字。通过指定地址族(IPv4或IPv6)和套接字类型(TCP或UDP),来创建相应类型的套接字。

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建TCP套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)   # 创建UDP套接字

绑定地址: 服务器套接字需要绑定一个IP地址和端口号,以便客户端可以连接。客户端套接字通常不需要绑定。

server_address = ('127.0.0.1', 12345)
server_socket.bind(server_address)

 监听连接: 对于服务器套接字,需要调用listen()方法来准备接受连接请求。

server_socket.listen(5)  # 允许同时等待5个连接请求

接受连接: 服务器套接字使用accept()方法来接受客户端的连接请求,并返回新的套接字用于与客户端通信。

client_socket, client_address = server_socket.accept()

3.3 套接字通信模型和方法:send、recv

        套接字通信模型是基于发送和接收数据的。在TCP通信中,通常使用send()方法发送数据,然后使用recv()方法接收数据。在UDP通信中,使用sendto()方法发送数据,使用recvfrom()方法接收数据。

3.3.1 TCP通信模型

服务器端:

client_socket, client_address = server_socket.accept()
data = client_socket.recv(1024)  # 接收数据
client_socket.send(b"Hello, client!")  # 发送数据

客户端:

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 12345))
client_socket.send(b"Hello, server!")  # 发送数据
data = client_socket.recv(1024)  # 接收数据

3.3.2 UDP通信模型

服务器端:

data, client_address = server_socket.recvfrom(1024)  # 接收数据
server_socket.sendto(b"Hello, client!", client_address)  # 发送数据

 客户端:

client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.sendto(b"Hello, server!", ('127.0.0.1', 12345))  # 发送数据
data, server_address = client_socket.recvfrom(1024)  # 接收数据

 通过理解套接字的基本概念、操作和通信模型,您可以开始构建简单的网络通信应用,如基于TCP或UDP的客户端和服务器。随着学习的深入,您可以扩展到更复杂的网络应用,如实时通信、网络安全等领域。

4. 客户端-服务器模型

        客户端-服务器模型是网络编程中常见的通信模式,其中客户端发起请求,服务器接收请求并提供服务。客户端向服务器发送请求,并等待服务器响应。以下是关于客户端和服务器的角色、交互方式以及创建简单通信示例的说明:

4.1 客户端的角色

        客户端是请求服务的一方。它向服务器发送请求,并等待服务器响应。客户端通常是终端用户使用的应用程序,如Web浏览器、移动应用、聊天客户端等。

4.2  服务器的角色

         服务器是提供服务的一方。它接收客户端的请求,处理请求,并返回响应。服务器通常运行在高性能的计算机上,以提供各种服务,如网页、数据存储、实时通信等。

4.3 客户端-服务器的交互

        典型的客户端-服务器交互包括以下步骤:

  • 客户端发起连接请求。
  • 服务器接受连接请求,并分配一个处理请求的线程或进程。
  • 客户端发送请求数据给服务器。
  • 服务器处理请求,并返回响应数据给客户端。
  • 客户端接收服务器的响应,并处理响应数据。

4.4 创建简单的客户端和服务器通信示例:

        下面是一个使用Python的Socket库创建简单的TCP客户端和服务器通信示例。这个示例中,客户端发送一个消息给服务器,服务器接收消息并返回一个确认响应。

服务器端:

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 12345))
server_socket.listen(5)

print("Server listening...")

while True:
    client_socket, client_address = server_socket.accept()
    print(f"Connected to {client_address}")

    data = client_socket.recv(1024)
    print("Received:", data.decode())

    response = "Message received!"
    client_socket.send(response.encode())

    client_socket.close()

客户端:

import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 12345))

message = "Hello, server!"
client_socket.send(message.encode())

response = client_socket.recv(1024)
print("Server response:", response.decode())

client_socket.close()

 在这个示例中,服务器监听连接请求,接受客户端连接,并接收来自客户端的消息。服务器处理消息后,向客户端发送确认响应。客户端连接到服务器,发送消息并接收服务器的响应。这展示了一个简单的客户端-服务器通信过程。

5. WebSocket编程

        WebSocket是一种基于TCP的协议,旨在实现全双工的双向通信,允许服务器主动向客户端推送数据,而不需要客户端先发起请求。WebSocket在实时应用程序、聊天应用、实时通知等场景中非常有用。

5.1 WebSocket协议和特点

  • WebSocket使用单个长连接,避免了HTTP中频繁的连接和断开。
  • 客户端和服务器可以随时发送数据,实现实时通信。
  • 协议本身支持双向通信,无需额外的轮询。
  • 适用于浏览器和服务器之间的实时交互。

5.2 使用第三方库实现WebSocket通信

  websockets是一个流行的Python库,用于实现WebSocket通信。以下是使用websockets库创建WebSocket服务器和客户端的示例:

WebSocket服务器:

import asyncio
import websockets

async def echo(websocket, path):
    async for message in websocket:
        await websocket.send(message)

start_server = websockets.serve(echo, "127.0.0.1", 8765)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

WebSocket客户端:

import asyncio
import websockets

async def hello():
    uri = "ws://localhost:8765"
    async with websockets.connect(uri) as websocket:
        await websocket.send("Hello, WebSocket!")
        response = await websocket.recv()
        print(response)

asyncio.get_event_loop().run_until_complete(hello())

        在这个示例中,WebSocket服务器监听在ws://localhost:8765,当有客户端连接并发送消息时,服务器会将相同的消息回传给客户端。客户端连接到服务器后,发送消息并等待服务器的响应。

        通过使用websockets库,您可以方便地实现WebSocket通信,用于构建实时的、双向的网络应用程序。这使得实时聊天、实时更新、实时监控等应用场景变得更加容易。

6. 异步编程和多线程

6.1 异步编程的概念和优势

        异步编程是一种编程模式,旨在处理I/O密集型任务,使程序能够在等待I/O操作完成时继续执行其他任务,而不是阻塞整个进程。异步编程可以提高程序的并发性和响应性,因为它允许程序在等待I/O的同时执行其他任务。

主要的异步编程优势包括:

  • 非阻塞: 异步编程允许程序在等待I/O时继续执行其他任务,不会阻塞整个进程。
  • 更高的并发性: 多个任务可以同时执行,提高了程序的并发性能。
  • 更好的响应性: 程序可以在繁忙的情况下仍然保持响应,因为它可以在等待I/O时执行其他任务。

6.2 使用asyncio库实现异步网络编程

        asyncio是Python的异步I/O框架,用于编写异步代码。以下是使用asyncio库实现异步网络编程的示例:

import asyncio

async def main():
    await asyncio.gather(fetch_url("https://example.com"), fetch_url("https://google.com"))

async def fetch_url(url):
    print(f"Fetching {url}")
    await asyncio.sleep(2)
    print(f"Fetched {url}")

asyncio.run(main())

        在这个示例中,两个fetch_url协程同时发起对不同网址的异步请求。通过await asyncio.gather(),它们可以并发执行,利用了异步的优势。

6.3 使用threading库实现多线程网络编程

         threading是Python的线程管理库,可以用于创建和管理多个线程。以下是使用threading库实现多线程网络编程的示例:

import threading
import requests

def fetch_url(url):
    print(f"Fetching {url}")
    response = requests.get(url)
    print(f"Fetched {url}")

thread1 = threading.Thread(target=fetch_url, args=("https://example.com",))
thread2 = threading.Thread(target=fetch_url, args=("https://google.com",))

thread1.start()
thread2.start()

thread1.join()
thread2.join()

print("Threads completed")

     在这个示例中,两个线程同时发起对不同网址的请求。每个线程使用requests库来发送HTTP请求。

        请注意,这些示例中的异步和多线程代码主要关注于并发执行,以展示异步编程和多线程的基本概念。在实际应用中,您可能需要处理更多的错误处理、同步、资源共享等问题。

7. 数据安全和加密

        网络编程的安全性和防御是确保网络通信和应用程序免受恶意攻击、数据泄漏和其他安全威胁的关键方面。以下是网络编程安全与防御的详解和示例:

7.1 数据加密与隐私保护

         使用加密算法保护数据在传输过程中的隐私。SSL/TLS协议可以为网络通信提供加密层,确保数据传输过程中不易被窃取或篡改。

示例:使用Python的ssl库为网络连接添加SSL加密

import ssl
import socket

context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
with socket.create_connection(('example.com', 443)) as client_socket:
    with context.wrap_socket(client_socket, server_hostname='example.com') as secure_socket:
        secure_socket.send(b'Hello, server!')
        response = secure_socket.recv(1024)

7.2 输入验证和过滤

         对于从客户端接收的输入,始终进行有效性验证和过滤,以防止恶意输入或攻击。

示例:使用Django Web框架中的输入验证。

from django import forms

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

7.3 防范跨站脚本攻击(XSS)

         避免在页面中直接插入未经验证的用户输入,以防止XSS攻击。使用输入过滤和编码来确保输出的安全性。

示例:使用Flask框架中的escape函数防止XSS攻击。

from flask import Flask, escape

app = Flask(__name__)

@app.route('/hello')
def hello():
    name = request.args.get('name', '')
    safe_name = escape(name)
    return f'Hello, {safe_name}!'

7.4 防范SQL注入

        使用参数化查询或ORM(对象关系映射)库来防止SQL注入攻击。不要直接将用户输入拼接到SQL查询中。

示例:使用SQLAlchemy参数化查询。

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///mydatabase.db')
Session = sessionmaker(bind=engine)
session = Session()

username = "admin' OR '1'='1"
user = session.query(User).filter_by(username=username).first()

   7.5 安全更新和漏洞修复

    定期更新使用的库和框架,以获取最新的安全修复。监控漏洞通告,及时应对已知的安全漏洞。

示例:使用命令更新Python库。

pip install --upgrade package-name

8. 身份验证和授权

8.1 用户身份验证的方法和技术

         用户身份验证是确定用户是谁的过程,以确保用户拥有访问所请求资源的权限。常见的身份验证方法包括:

  1. 用户名和密码: 用户提供用户名和密码进行验证。需要保护密码的安全性,通常使用哈希和加盐技术。
  2. 多因素身份验证(MFA): 用户提供多个验证因素,如密码、手机验证码、指纹等,以增加安全性。
  3. 单点登录(SSO): 用户一次登录后可以访问多个关联应用,避免多次输入凭据。
  4. 社交媒体登录: 用户可以使用其社交媒体账号登录,如Google、Facebook等。
  5. 证书: 用户拥有数字证书,用于身份验证和加密通信。

8.2 实现用户登录和访问控制

          确保只有授权用户才能访问敏感数据或功能。使用身份验证(验证用户身份)和授权(分配访问权限)来限制访问。

  1. 用户登录:用户提供身份信息(用户名/密码等),服务器验证身份信息,并提供令牌作为后续访问的凭证。
  2. 访问控制:使用会话、令牌等机制,确保用户只能访问其被授权的资源,对未授权的资源进行拒绝访问。

示例:使用Flask-Login库实现用户身份验证。

from flask import Flask, render_template
from flask_login import LoginManager, login_required

app = Flask(__name__)
login_manager = LoginManager(app)

@app.route('/profile')
@login_required
def profile():
    return render_template('profile.html')

8.3 使用JWT进行身份验证

         JSON Web Token(JWT)是一种开放标准,用于在两个实体之间安全地传输信息。它由三部分组成:头部、载荷和签名。JWT常用于身份验证和授权。

  • 头部(Header): 指定令牌的类型和签名算法。
  • 载荷(Payload): 包含用户的相关信息,如用户ID、角色等。
  • 签名(Signature): 通过将头部和载荷使用密钥签名,确保令牌的完整性。

示例:使用Python中的PyJWT库创建和验证JWT令牌:

import jwt
import datetime

# 创建JWT令牌
payload = {"user_id": 123, "exp": datetime.datetime.utcnow() + datetime.timedelta(days=1)}
secret_key = "secret_key"
token = jwt.encode(payload, secret_key, algorithm="HS256")

print("Token:", token)

# 验证JWT令牌
try:
    decoded_payload = jwt.decode(token, secret_key, algorithms=["HS256"])
    print("Decoded Payload:", decoded_payload)
except jwt.ExpiredSignatureError:
    print("Token expired")
except jwt.InvalidTokenError:
    print("Invalid token")

通过JWT,您可以实现安全的用户身份验证和访问控制,避免在服务器上存储会话状态,从而降低服务器的负担。

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

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

相关文章

Linux系统编程:线程互斥

目录 一. 与线程互斥相关的概念 二. 线程安全问题 2.1 多个执行流访问临界区资源引发线程安全问题 2.2 可重入函数和线程安全的关系 三. 互斥锁 mutex 3.1 互斥锁功能 3.2 互斥锁的使用 3.3 互斥锁的实现原理 四. 死锁问题 四. 总结 一. 与线程互斥相关的概念 临界…

9.oracle中sign函数

在Oracle/PLSQL中, sign 函数返回一个数字的正负标志. 语法如下&#xff1a;sign( number ) number 要测试标志的数字. If number < 0, then sign returns -1. If number 0, then sign returns 0. If number > 0, then sign returns 1. 应用于: Oracle 8i, Oracle …

mysql my.ini、登录、用户相关操作、密码管理、权限管理、权限表,角色管理

my.ini 配置文件格式 登录mysql mysql -h hostname | IP -P port -u username -p database -e “select 语句”&#xff1b; 创建用户、修改用户、删除用户 create user ‘zen’ identified by ‘密码’ ## host 默认是 % create user ‘zen’‘localhost’ identified by ‘密…

<高阶数据结构>图

图 必要概念大致用途 存图邻接矩阵邻接表 遍历BFS(广度优先)DFS(深度优先) 最小生成树Kruskal算法Prim算法 寻最短路径Dijkstra算法 必要概念 图根据有无方向分为&#xff0c;有向图和无向图 组成&#xff1a;G (V, E) 顶点集合 V边的集合 E G(Graph),V(Vertex),E(Edge) 图可…

Docker容器:docker consul的注册与发现及consul-template

Docker容器&#xff1a;docker consul的注册与发现及consul-template守护进程 一.docker consul的注册与发现介绍 1.什么是服务注册与发现 &#xff08;1&#xff09;服务注册与发现是微服务架构中不可或缺的重要组件。 &#xff08;2&#xff09;为解决服务都是单节点的&a…

李沐pytorch学习-BatchNormalization

一、意义 在使用较深的网络时&#xff0c;BatchNormalization&#xff08;批量归一化&#xff09;几乎是必需的&#xff0c;可以加速收敛。 对于图1所示的全连接层神经网络&#xff0c;输出节点的GroundTruth为&#xff0c;损失函数为&#xff0c;则损失对权重的梯度为&#xf…

接口测试总结分享(http与rpc)

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 一、了解一下HTTP与RPC 1. HTTP&#xff08;H…

YOLOv5屏蔽区域检测(选择区域检测)

YOLOv5屏蔽区域检测以及选择区域检测 前期准备labelme选择mask区域 代码改动 前期准备 思路就是通过一个mask掩膜&#xff0c;对我们想要屏蔽或者选择的区域进行遮挡处理&#xff0c;在推理的时候&#xff0c;将有mask掩膜的图像输入&#xff0c;将最后的结果显示在原始图像上…

【Go 基础篇】Go语言中的自定义错误处理

错误是程序开发过程中不可避免的一部分&#xff0c;而Go语言以其简洁和高效的特性闻名。在Go中&#xff0c;自定义错误&#xff08;Custom Errors&#xff09;是一种强大的方式&#xff0c;可以为特定应用场景创建清晰的错误类型&#xff0c;以便更好地处理和调试问题。本文将详…

基于微信小程序的汽车租赁系统的设计与实现ljx7y

汽车租赁系统&#xff0c;主要包括管理员、用户二个权限角色&#xff0c;对于用户角色不同&#xff0c;所使用的功能模块相应不同。本文从管理员、用户的功能要求出发&#xff0c;汽车租赁系统系统中的功能模块主要是实现管理员后端&#xff1b;首页、个人中心、汽车品牌管理、…

算法通关村十三关 | 进制转换问题处理模板

1. 七进制数 题目&#xff1a;LeetCode504&#xff1a;504. 七进制数 - 力扣&#xff08;LeetCode&#xff09; 思路 进制转换&#xff0c;对几转换就是对几求余&#xff0c;最后将所有的余数反过来即可、如果num< 0&#xff0c;先取绝对值&#xff0c;再进行操作。 100转7…

MYSQL表的增删改查(单表)

文章目录 一、CRUD二、creat(新增)三、查询&#xff08;Retrieve&#xff09;四、修改&#xff08;update&#xff09;五、删除&#xff08;Delete&#xff09; 一、CRUD SQL 最核心的就是增删改查&#xff0c;后端开发工作中&#xff0c;遇到的最核心的操作也是这个 二、creat…

2023高教社杯数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

Blazor 依赖注入妙用:巧设回调

文章目录 前言依赖注入特性需求解决方案示意图 前言 依赖注入我之前写过一篇文章&#xff0c;没看过的可以看看这个。 C# Blazor 学习笔记(10):依赖注入 依赖注入特性 只能Razor组件中注入所有Razor组件在作用域注入的都是同一个依赖。作用域可以看看我之前的文章。 需求 …

string类中的一些问题

前言&#xff1a;C中的string类是继承C语言的字符数组的字符串来实现的&#xff0c;其中包含许多C的字符串的相关知识的同时&#xff0c;也蕴含很多的类与对象的相关知识&#xff0c;在面试中&#xff0c;面试官总喜欢让学生自己来模拟实现string类&#xff0c;最主要是实现str…

azure data studio SQL扩展插件开发笔记

node.js环境下拉取脚手架 npm install -g yo generator-azuredatastudio yo azuredatastudio 改代码 运行 调试扩展&#xff0c;在visual studio code中安装插件即可 然后visual studio code打开进行修改运行即可 image.png 运行后自动打开auzre data studio了&#xff0c; 下面…

开源与专有软件:比较与对比

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

中文乱码处理

&#x1f600;前言 中文乱码处理 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609;&#x1f609; 在csdn获奖荣誉: &#x1f3c…

kubernetes deploy standalone mysql demo

kubernetes 集群内部署 单节点 mysql ansible all -m shell -a "mkdir -p /mnt/mysql/data"cat mysql-pv-pvc.yaml apiVersion: v1 kind: PersistentVolume metadata:name: mysql-pv-volumelabels:type: local spec:storageClassName: manualcapacity:storage: 5Gi…

JVM第一篇 认识java虚拟机

目录 1. 什么是java虚拟机 2. java虚拟机分类 2.1. 商用虚拟机 2.2. 嵌入式虚拟机 3.java虚拟机架构 4.java虚拟机运行过程 1. 什么是java虚拟机 传统意义上的虚拟机是一种抽象化的计算机&#xff0c;通过在实际的计算机上仿真模拟各种计算机功能来实现的&#xff0c;是操…