当前位置: 首页 > news >正文

案例速成GO+Socket,个人笔记

更多个人笔记:(仅供参考,非盈利)
gitee: https://gitee.com/harryhack/it_note
github: https://github.com/ZHLOVEYY/IT_note

文章目录

    • 简单知识了解
    • 实现一个TCP 服务器与客户端(聊天室)
    • UDP客户端和服务端
    • WebSocket 服务器与客户端(实时聊天)

简单知识了解

Socket位于应用层和传输层之间,属于传输的媒介
tcp三次握手和四次挥手是基于socket实现的
三次: A:syn(连接么) B:syn+ack(连,你也发个连) A:ack(连)
四次:A:fin(断吧) B:ack (ok) B:fin(断吧) A:ack(ok)

Go中用net包操作socket

  • 客户端net.Dial无论什么形式都能连接
  • 服务器端使用net.listen (进一步net.accept进行监听)

Dial支持TCP,UDP,ICMP,等

实现一个TCP 服务器与客户端(聊天室)

分为server和client 可以一个serer对多个client

server代码:

package mainimport ("bufio""fmt""log""net""sync""os"
)func main() {listener, err := net.Listen("tcp", ":8080")if err != nil {log.Fatal("监听失败:", err)}defer listener.Close()fmt.Println("TCP 服务器启动,监听 :8080")// 客户端连接管理var clients []net.Connvar mutex sync.Mutex// 添加服务器发送消息的 goroutinego func() {reader := bufio.NewReader(os.Stdin)for {msg, err := reader.ReadString('\n')if err != nil {log.Println("读取控制台输入失败:", err)continue}// 广播服务器消息broadcast := fmt.Sprintf("[Server]: %s", msg)mutex.Lock()for _, c := range clients {c.Write([]byte(broadcast))}mutex.Unlock()}}()// 继续处理客户端连接for {conn, err := listener.Accept()if err != nil {log.Println("接受连接失败:", err)continue}fmt.Printf("新客户端连接: %s\n", conn.RemoteAddr().String())// 添加到客户端列表mutex.Lock()clients = append(clients, conn)mutex.Unlock()// 启动 goroutine 处理客户端go handleClient(conn, &clients, &mutex)}}
func handleClient(conn net.Conn, clients *[]net.Conn, mutex *sync.Mutex) {defer conn.Close()// 读取客户端消息reader := bufio.NewReader(conn)for {msg, err := reader.ReadString('\n')if err != nil {fmt.Printf("客户端 %s 断开: %v\n", conn.RemoteAddr().String(), err)// 从客户端列表移除mutex.Lock()for i, c := range *clients {if c == conn {*clients = append((*clients)[:i], (*clients)[i+1:]...)break}}mutex.Unlock()return // 退出这个协程}// 广播消息broadcast := fmt.Sprintf("[%s]: %s", conn.RemoteAddr().String(), msg) //这里是整合起来fmt.Print(broadcast)mutex.Lock()for _, c := range *clients {if c != conn {c.Write([]byte(broadcast))}}mutex.Unlock()}}

这一类包名一般都是记不住的,需要掌握构建逻辑:

  • 建立listen
  • 因为可能有多个client连接,所以需要list,所以为了解决并发问题所以才引入的lock
  • 服务器发送消息一个协程 (广播 )
  • listen accept建立conn,每个conn对应客户端
  • conn中处理读取客户端的信息,通过bufio
  • 如果客户端断开,通过msg能不能读取的到进行判断

client代码:

package mainimport ("bufio""fmt""log""net""os"
)func main() {// 连接服务器conn, err := net.Dial("tcp", "localhost:8080")if err != nil {log.Fatal("连接失败:", err)}defer conn.Close()fmt.Println("已连接到服务器")// 启动 goroutine 读取服务器消息go func() {reader := bufio.NewReader(conn)for {msg, err := reader.ReadString('\n')if err != nil {log.Println("服务器断开:", err)return}fmt.Print(msg)}}()// 从标准输入读取并发送消息scanner := bufio.NewScanner(os.Stdin)for scanner.Scan() {msg := scanner.Text() + "\n"_, err := conn.Write([]byte(msg))if err != nil {log.Println("发送失败:", err)return}}
}

client部分思路:

  • 通过dial进行连接,生成conn
  • 通过bufio读取conn,从服务器传递的信息
  • 设置发送给服务器的信息,通过write写入

UDP客户端和服务端

多开几个终端跑,会发现一个client发送的信息,所有的client都能收到,是UDP的群发,server在中间充当转接和管理的作用

serer.go:

package mainimport ("fmt""log""net""sync"
)func main() {// 监听 UDP 端口addr, err := net.ResolveUDPAddr("udp", ":8081") //进行地址转换if err != nil {log.Fatal("解析地址失败:", err)}conn, err := net.ListenUDP("udp", addr)if err != nil {log.Fatal("监听端口失败:", err)}defer conn.Close()fmt.Println("已监听 UDP 端口:", addr)// 客户端地址列表var clients []net.Addrvar mutex sync.Mutex// 读取和广播buffer := make([]byte, 1024)for {n, clientAddr, err := conn.ReadFromUDP(buffer)if err != nil {log.Println("读取失败:", err)continue}msg := string(buffer[:n])fmt.Printf("收到 %s: %s", clientAddr.String(), msg)// 添加新客户端mutex.Lock()if !contains(clients, clientAddr) {clients = append(clients, clientAddr)fmt.Printf("新客户端: %s\n", clientAddr.String())}mutex.Unlock()// 广播消息mutex.Lock()for _, addr := range clients {if addr.String() != clientAddr.String() { //避免消息回显给发送者,实现群体发送的效果conn.WriteToUDP([]byte(fmt.Sprintf("[%s]: %s", clientAddr.String(), msg)), addr.(*net.UDPAddr))}}mutex.Unlock()}}func contains(clients []net.Addr, addr net.Addr) bool {for _, c := range clients {if c.String() == addr.String() {return true}}return false
}
  • 进行UDP地址转换
  • 建立conn连接
  • 建立客户列表
  • 通过buffer读取信息
  • 通过list进行广播,防止发送给发送者

client.go


package mainimport ("bufio""fmt""log""net""os"
)func main() {// 连接服务器addr, err := net.ResolveUDPAddr("udp", "localhost:8081")if err != nil {log.Fatal("解析地址失败:", err)}conn, err := net.DialUDP("udp", nil, addr)if err != nil {log.Fatal("连接失败:", err)}defer conn.Close()fmt.Println("已连接到 UDP 服务器")// 启动 goroutine 读取消息go func() {buffer := make([]byte, 1024)for {n, _, err := conn.ReadFromUDP(buffer)if err != nil {log.Println("读取失败:", err)return}fmt.Print(string(buffer[:n]))}}()// 发送消息scanner := bufio.NewScanner(os.Stdin)for scanner.Scan() {msg := scanner.Text() + "\n"_, err := conn.Write([]byte(msg))if err != nil {log.Println("发送失败:", err)return}}
}
  • udp地址转换
  • 通过conn连接
  • 启动一个协程一直监听,这样能输出收到的消息
  • 同时利用scan,自己也能write发送消息

WebSocket 服务器与客户端(实时聊天)

WebSocket 提供全双工通信,适合实时应用。以下使用 gorilla/websocket 实现聊天室
多启动启动几个前端文件,然后可以实现一个发消息,别的接收到

server.go:


package mainimport ("fmt""log""net/http""sync""github.com/gorilla/websocket"
)var upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool {return true // 允许所有来源的连接},
}func main() {// 客户端连接管理var clients = make(map[*websocket.Conn]bool) //定义函数在外部,每次访问都调用函数,修改 var mutex sync.Mutex//WebSocket路由http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {conn, err := upgrader.Upgrade(w, r, nil) //upgrader.Upgrade 的作用是将 HTTP 连接升级为 WebSocket 连接if err != nil {log.Println("升级失败:", err)return}fmt.Printf("新客户端连接:%s\n", conn.RemoteAddr().String())// 添加客户端mutex.Lock()clients[conn] = truemutex.Unlock()//处理消息for {_, msg, err := conn.ReadMessage()if err != nil {fmt.Printf("客户端断开连接:%s\n", conn.RemoteAddr().String())mutex.Lock()delete(clients, conn)mutex.Unlock()conn.Close()return}broadcast := fmt.Sprintf("[%s]: %s\n", conn.RemoteAddr().String(), msg)fmt.Print(broadcast)//广播消息mutex.Lock()for c := range clients {if c != conn {c.WriteMessage(websocket.TextMessage, []byte(broadcast))}}mutex.Unlock()}})// 启动服务器fmt.Println("WebSocket 服务器启动,监听 :8080")log.Fatal(http.ListenAndServe(":8080", nil)) //使用 log.Fatal 可以立即记录错误并终止程序
}
  • 构建conn,每个客户端访问都会调用函数修改clients
  • 通过conn读取信息,并判断客户端是否还连接着
  • 通过clients列表广播消息
  • 正常到http包,启动服务

前端html文件: (了解就行)

<!DOCTYPE html>
<html>
<head><title>WebSocket 聊天室</title>
</head>
<body><input id="message" type="text" placeholder="输入消息"><button onclick="sendMessage()">发送</button><div id="output"></div><script>const ws = new WebSocket("ws://localhost:8080/ws"); //建立 WebSocket 连接ws.onmessage = function(event) { //处理接收消息(事件监听)const output = document.getElementById("output");output.innerHTML += "<p>" + event.data + "</p>";};ws.onclose = function() { //处理连接断开alert("连接断开");};function sendMessage() { //发送消息函数:const input = document.getElementById("message"); //获取输入ws.send(input.value);input.value = "";}</script>
</body></html>
  • 简单的输入框设计
  • js部分见注释,先建立连接,然后处理消息接收,断开和发送 三个组成部分

终端中打开html文件:

# Windows
start file.html  # 或 start chrome file.html# macOS
open file.html  # 或 open -a "Google Chrome" file.html# Linux
xdg-open file.html

然后进行测试就可以

相关文章:

案例速成GO+Socket,个人笔记

更多个人笔记&#xff1a;&#xff08;仅供参考&#xff0c;非盈利&#xff09; gitee&#xff1a; https://gitee.com/harryhack/it_note github&#xff1a; https://github.com/ZHLOVEYY/IT_note 文章目录 简单知识了解实现一个TCP 服务器与客户端&#xff08;聊天室&#x…...

篮球足球体育球员综合资讯网站模板

采用帝国CMS7.5新版核心。栏目和内容模板超多变换。后台操作简单&#xff0c;安全可靠&#xff0c;性能稳定。整站浏览效果高端大气&#xff0c;可以帮助你快速建立一个适合自己的软件下载类型的站点&#xff01; 演示地址&#xff1a;https://www.tmuban.com/store/620.html …...

HTTP(超文本传输协议)全面总结

HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是万维网&#xff08;World Wide Web&#xff09;应用中的基础协议&#xff0c;用于客户端与服务器之间的数据传输。随着互联网技术的发展&#xff0c;HTTP协议也经历了多个版本的更新&…...

OpenCV 图形API(72)图像与通道拼接函数-----根据指定的方式翻转图像(GMat)函数 flip()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 翻转一个2D矩阵&#xff0c;围绕垂直轴、水平轴或同时围绕两个轴。 该函数以三种不同的方式之一翻转矩阵&#xff08;行和列的索引是从0开始的&a…...

【报错问题】 macOS 的安全策略(Gatekeeper)阻止了未签名的原生模块(bcrypt_lib.node)加载

这个错误是由于 macOS 的安全策略&#xff08;Gatekeeper&#xff09;阻止了未签名的原生模块&#xff08;bcrypt_lib.node&#xff09;加载 导致的。以下是具体解决方案&#xff1a; 1. 临时允许加载未签名模块&#xff08;推荐先尝试&#xff09; 在终端运行以下命令&#x…...

keep-alive具体使用方法

什么是 Keep-Alive <keep-alive> 是 Vue.js 提供的一个内置组件&#xff0c;用于缓存动态组件实例&#xff0c;从而避免重复渲染已加载过的组件。它的主要功能是在切换组件时保留状态和 DOM 结构&#xff0c;提升性能。 工作原理 <keep-alive> 的核心在于维护一个…...

【C++11】包装器:function与bind

前言&#xff1a; 上文我们学了C11中一个新的表达式&#xff1a;Lambda表达式。Lambda表达式可以在函数内部定义&#xff0c;其本质是仿函数【C11】Lambda表达式-CSDN博客 本文我们来学习C11的下一个新语法&#xff1a;包装器 function function的定义为&#xff1a; templat…...

Educational Codeforces Round 178 div2(题解ABCDE)

A. Three Decks #1.由于最后三个数会相等&#xff0c;提前算出来和&#xff0c;%3判断&#xff0c;再判前两个数是否大于 #include<iostream> #include<vector> #include<stdio.h> #include<map> #include<string> #include<algorithm> #…...

mermaid 序列图 解析

sequenceDiagramparticipant UI as 用户界面participant Executor as 任务执行器participant StateMgr as 状态管理器participant Repo as 数据仓库UI->>Executor: 执行任务3350c74e...Executor->>StateMgr: 更新状态为"measuring"StateMgr->>Repo…...

DTO,VO,PO,Entity

1. DTO (Data Transfer Object) 定义 DTO 是数据传输对象&#xff0c;用于在不同系统或层之间传输数据。 目的 简化数据传输&#xff0c;降低耦合&#xff0c;通常只包含需要传输的字段&#xff0c;避免暴露内部实现细节。 使用场景 Controller 和 Service 或 远程调用 之…...

Proser:重新介绍

回想Proser的定位&#xff1a;一款直观的【协议发送】模拟软件。 现在间断更新下来&#xff0c;基本成了一款通信调试助手类软件 Proser 是一款支持串口与网络的通信调试助手&#xff0c;其独有的协议编辑器、数据检视、标尺等功能&#xff0c;让指令模拟与数据分析更加易用。…...

微信小程序 首页之轮播图和搜索框 代码分享

注意&#xff01;&#xff01;&#xff01; 只有样式&#xff0c;还没功能开发&#xff01;&#xff01;&#xff01; index.wxml <!-- 搜索框 --> <view class"search"><input placeholder"请输入搜索的内容"></input><imag…...

3D可视化编辑器模版

体验地址&#xff1a;http://mute.turntip.cn 整个搭建平台核心模块包含如下几个部分&#xff1a; 3D场景渲染 组件拖拽系统 元素编辑功能 状态管理 历史记录与撤销/重做 技术栈 前端框架与库 React 18 用于构建用户界面的JavaScript库 Next.js 14 React框架&#xff0c;提供服…...

foc控制 - clarke变换和park变换

1. foc控制框图 下图是foc控制框图&#xff0c;本文主要是讲解foc控制中的larke变换和park变换clarke变换将 静止的 a b c abc abc坐标系 变换到 静止的 α β αβ αβ坐标系&#xff0c;本质上还是以 定子 为基准的坐标系park变换 则将 α β αβ αβ坐标系 变换到 随 转…...

DeepSeek: 探索未来的深度学习搜索引擎

深度学习驱动的下一代搜索引擎&#xff1a;DeepSeek 在信息爆炸的时代&#xff0c;搜索引擎作为连接用户与互联网世界的桥梁&#xff0c;其重要性不言而喻。然而&#xff0c;随着用户需求的日益多样化和复杂化&#xff0c;传统搜索引擎在理解和满足用户需求方面逐渐显现出局限…...

如何在本地部署小智服务器:从源码到全模块运行的详细步骤

小智聊天机器人本地后台服务器源码全模块部署 作者&#xff1a;林甲酸 -不是小女子也不是女汉子 是大女子 更新日期&#xff1a;2025年4月29日 &#x1f3af; 前言&#xff1a;为什么要写这篇教程&#xff1f; 上周按照虾哥小智服务器的教程去部署本地后台&#xff0c;我用的是…...

基于论文的大模型应用:基于SmartETL的arXiv论文数据接入与预处理(四)

上一篇介绍了基于SmartETL框架实现arxiv采集处理的基本流程&#xff0c;通过少量的组件定制开发&#xff0c;配合yaml流程配置&#xff0c;实现了复杂的arxiv采集处理。 由于其业务流程复杂&#xff0c;在实际应用中还存在一些不足需要优化。 5. 基于Kafka的任务解耦设计 5.…...

GrapesJS 终极定制组件设计方案:扁平化对象属性编辑、多区域拖拽、多层嵌套与组件扩展实战

掌握 GrapesJS 复杂组件实用技巧&#xff0c;打造高复用、高交互的前端低代码组件体系 随着低代码可视化编辑需求日益提升&#xff0c;GrapesJS 作为优秀开源画布编辑器&#xff0c;灵活的组件机制是其核心优势。但在实际项目中&#xff0c;你可能会遇到&#xff1a; 如何编辑…...

Spring MVC 如何映射 HTTP 请求到 Controller 方法?

我们来详细分析一下如何在 Spring MVC 中将 HTTP 请求映射到 Controller 的处理方法&#xff08;Handler Methods&#xff09;上&#xff0c;以及 RequestMapping 注解的使用方法。 请求映射的核心&#xff1a;RequestMapping 注解 RequestMapping 是 Spring MVC 中最核心、最…...

vue.js中的一些事件修饰符【前端】

不要一直责怪过去的自己&#xff0c;他独自站在雾里也很迷茫。 目录 .stop&#xff1a;.prevent&#xff1a;.self&#xff1a;.once&#xff1a;.capture&#xff1a;.native&#xff1a;何时使用 .native&#xff1f; .stop&#xff1a; 作用&#xff1a;调用 event.stopPro…...

WEBSTORM前端 —— 第2章:CSS —— 第4节:盒子模型

目录 1.画盒子 2.Pxcook软件 3.盒子模型——组成 4.盒子模型 ——边框线 5.盒子模型——内外边距 6.盒子模型——尺寸计算 7.清除默认样式 8.盒子模型——元素溢出 9.外边距问题 ①合并现象 ②塌陷问题 10.行内元素——内外边距问题 11.盒子模型——圆角 12.盒子…...

Cursor —— AI编辑器 使用详解

Cursor - The AI Code Editor 一、Cursor 是什么&#xff1f; Cursor 是一款优秀的AI代码编辑器&#xff0c;它内置了 Deepseek-R1、GPT-4、Claude等 AI 模型。 简单说&#xff0c;就是&#xff1a;Cursor VS Code 编辑器 AI 大模型 Cursor 功能特性&#xff08;代码补全、…...

故障诊断——复现github代码ClassBD-CNN(BDCNN)

刚好看到这篇文献有github代码&#xff0c;而且也比较新&#xff0c;感觉可以当作自己论文中的对比方法。 https://www.sciencedirect.com/science/article/pii/S0888327024006484 &#xff08;论文地址&#xff09; &#xff08;看到4090&#xff0c;有点想劝退自己......&…...

局部和整体的关系

Prompt&#xff1a;为什么要研究局部和整体的关系呢&#xff1f;是因为很多情况下&#xff0c;局部就能表达出整体&#xff1f; 这是一个非常本质的问题&#xff0c;其实你已经接近数学和物理中“几何本质”的核心了。我们研究局部和整体的关系&#xff0c;是因为&#xff1a;…...

1.5 点云数据获取方式——双目立体相机

图1-5-1 双目立体相机 双目相机通过模拟人眼立体视觉,利用两个摄像头的视差信息计算物体深度,进而生成 3D 点云,具有成本低、体积小、信息丰富等优势,成为中...

Flume启动报错

报错1&#xff1a; 报错2&#xff1a; File Channel transaction capacity cannot be greater than the capacity of the channel capacit... 解决方案&#xff1a;删除配置...

leetcode 21. 合并两个有序链表(c++解法+相关知识点复习)

目录 题目 所需知识点复习 1.链表 1.1单链表 1.2哑结点&#xff08;Dummy Node&#xff09; 解答过程 1.循环双指针解法 2.递归解法 2025.4.29想到其他知识点会后续再继续补充。 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表…...

链表反转_leedcodeP206

P206反转链表 原题 反转思路 将链表反转的过程分为两个区域&#xff1a; &#x1f7e6; 未反转区&#xff08;待处理&#xff09; 原链表中还没有处理&#xff08;还没有反转指针方向&#xff09;的部分&#xff0c;从 current 开始一直到链表尾部。 &#x1f7e9; 已反转…...

Laravel+API 接口

LaravelAPI 接口 网课连接&#xff1a;BIlibili. 中文文档. 1.RestFul Api编码风格 一、API设计 修改hosts&#xff0c;C:\Windows\System32\drivers\etc\hosts&#xff0c;增加127.0.0.1 api.lv8.com # Laravel 框架 用这个域名来测试&#xff08;推荐规范&#xff09; 在…...

在 Ubuntu 上离线安装 ClickHouse

在 Ubuntu 上离线安装 ClickHouse 的步骤如下: 一.安装验证 # 检查服务状态 sudo systemctl status clickhouse-server #删除默认文件 sudo rm /etc/clickhouse-server/users.d/default-password.xml # 使用客户端连接 clickhouse-client --password...

【AI微信小程序开发】掷骰子小程序项目代码:自设骰子数量和动画(含完整前端代码)

系列文章目录 【AI微信小程序开发】AI减脂菜谱小程序项目代码:根据用户身高/体重等信息定制菜谱(含完整前端+后端代码)【AI微信小程序开发】AI菜谱推荐小程序项目代码:根据剩余食材智能生成菜谱(含完整前端+后端代码)【AI微信小程序开发】图片工具小程序项目代码:图片压…...

Linux-02-VIM和VI编辑器

第一节:什么是VI和VIM编辑器: VI是Unix和类Unix操作系统中出现的通用的文本编辑器。VIM是从VI发展出来的一个性能更强大的文本编辑器可以主动的以字体颜色辨别语法的正确性,方便程序设计,VIM和VI编辑器完全兼容。使用:vi xxx文件 或者vim xxx文件,简单来说就是用来编辑文件的一…...

同为科技 智能PDU产品选型介绍-EN10/G801FR

随着各行业对数据中心机房重视程度的不断提高&#xff0c; 加强机柜微环境及电源计量、监控和管理则十分必要。在新型微模块化数据中心供配电系统建设中&#xff0c;UPS电源、智能PDU、监控管理系统、资产管理等产品早已成为IDC机房不可或缺的部分。其中&#xff0c;智能PDU通过…...

NS-SWIFT微调Qwen3

目录 一、NS-SWIFT简介 二、Qwen3简介 三、微调Qwen3 1、安装NS-SWIFT环境 2、准备训练数据 3、Lora微调 4、GROP训练 5、Megatron并行训练 一、NS-SWIFT简介 SWIFT&#xff08;Scalable lightWeight Infrastructure for Fine-Tuning&#xff09;是魔搭ModelScope开源社…...

借 AI 热潮,深挖 [风车 AI ] 为跨境电商打造的图片翻译黑科技

家人们&#xff0c;这几年 AI 技术简直像坐了火箭一样飞速发展&#xff0c;生活里、工作中到处都能看到它的身影。对咱们跨境行业来说&#xff0c;语言翻译一直是个让人头疼的大问题。今天咱就借着这股 AI 热潮&#xff0c;好好深挖一下风车 AI 为跨境打造的那些超厉害的翻译黑…...

uni-app 中封装全局音频播放器

在开发移动应用时&#xff0c;音频播放功能是一个常见的需求。无论是背景音乐、音效还是语音消息&#xff0c;音频播放都需要一个稳定且易于管理的解决方案。在 uni-app 中&#xff0c;虽然原生提供了 uni.createInnerAudioContext 方法用于音频播放&#xff0c;但直接使用它可…...

Uniapp:设置TabBar

目录 一、setTabBarBadge:增加文本二、removeTabBarBadge:移除文本三、showTabBarRedDot:显示红点四、hideTabBarRedDot:隐藏红点一、setTabBarBadge:增加文本 为 tabBar 某一项的右上角添加文本。 uni.setTabBarBadge({index: 0,text: 1 })参数类型必填说明indexNumber…...

如何查看k8s获取系统是否清理过docker镜像

k8s集群某个节点down掉后&#xff0c;pod就会漂移到其他节点&#xff0c;但是在该节点却又执行了拉取镜像操作&#xff0c;明明该节点之前部署过该容器的&#xff0c;不知为什么又拉取了一次镜像&#xff08;镜像拉取配置的优先使用本地&#xff09;&#xff0c;所以怀疑是触发…...

【Linux网络】深入解析I/O多路转接 - Select

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

如何解决 Xcode 签名证书和 Provisioning Profile 过期问题

在 iOS 应用开发过程中&#xff0c;签名证书和 Provisioning Profile 是确保应用安全性和合法性的关键组件。然而&#xff0c;当这些证书或配置文件过期时&#xff0c;开发者可能会遇到编译或归档失败的问题。本文将详细介绍如何解决 Xcode 中“iOS Distribution”证书未找到和…...

[C++]C++20协程的原理

文章目录 协程的状态机Promise 对象挂起和恢复机制协程的执行流程示例代码分析 C 协程是 C20 引入的一项重要特性&#xff0c;它提供了一种更简洁、高效的异步编程方式。下面从协程的状态机、Promise 对象、挂起和恢复机制等方面介绍其底层实现原理。 协程的状态机 从底层角度…...

Oracle OCP证书有效期是三年?

这一段时间&#xff0c;网上经常传出消息Oracle OCM认证证书有效期为三年&#xff0c;其实这个假消息&#xff0c;通过博睿谷与Oracle官方人员确认&#xff0c;OCP认证证书有效期是永久的。 OCP证书本身永久有效&#xff0c;但老版本的OCP证书代表着更多的项目经验&#xff0c…...

2025.4.29_STM32_看门狗WDG

1.WDG简介 大概意思就是给看门狗设置一个时间范围&#xff0c;在这个范围内必须喂狗(重置定时器)&#xff0c;这个操作必须一直执行&#xff0c;比如看门狗的的时间范围是1-2秒&#xff0c;我们就必须间隔1-2秒就喂一次狗&#xff0c;否则它自减到0时就会重置电路&#xff0c;相…...

基于Java,SpringBoot,HTML水文水质监测预警系统设计

摘要 随着水资源管理需求的日益增长&#xff0c;构建高效、精准的水文监测预警系统至关重要。本文设计并实现了一套基于 Java、SpringBoot 和 HTML 技术的水文监测预警系统。系统采用 Java 语言与 SpringBoot 框架搭建后端服务&#xff0c;利用其强大的业务逻辑处理能力与高效…...

Qt开发:JSON字符串的序列化和反序列化

文章目录 一、构建和解析单个JSON对象二、JSON对象中嵌套多个JSON对象三、JSON对象中组建多个数组对象四、构建和解析数组对象 一、构建和解析单个JSON对象 1.1 JSON对象的构建 使用key-value形式生成JSON对象 #include <QJsonObject> #include <QJsonDocument> …...

第10次:电商项目配置开发环境

本次内容主要为给整个电商项目配置好开发环境&#xff0c;包括如下环节&#xff1a; 创建电商项目xiaoyu_mall&#xff0c;Django版本默认是最新的大版本5.2配置应用目录&#xff0c;因项目会涉及到多个应用&#xff0c;为保证项目结构清晰&#xff0c;将在项目下建立apps目录…...

【强化学习系列】Q-learning——从贝尔曼最优方程谈起

引言 上一篇贝尔曼最优方程中我们已经推导出动作价值形式的贝尔曼最优方程&#xff1a; q π ∗ ( s , a ) ∑ s ′ ∈ S ∑ r ∈ R p ( s ′ , r ∣ s , a ) [ r γ max ⁡ a ′ q π ∗ ( s ′ , a ′ ) ] \begin{equation}q_{\pi^*}(s,a)\sum_{s\in S}\sum_{r\in R}p(s,…...

Java 基础--运算符全解析

【Java 基础】Java 运算符全解析&#xff1a;程序世界的“加减乘除”与“是非对错” 作者&#xff1a;IvanCodes 发布时间&#xff1a;2025年4月29日&#x1f423; 专栏&#xff1a;Java教程 嗨&#xff0c;各位 Java 探险家们&#xff01;&#x1f44b; 掌握了变量、数据类…...

【神经网络与深度学习】改变随机种子可以提升模型性能?

引言 随机种子在机器学习和数据处理领域中至关重要&#xff0c;它决定了模型训练、数据划分以及参数初始化的随机性。虽然固定随机种子能确保实验的可重复性&#xff0c;但改变随机种子有时会意外提升模型性能。本文将探讨这一现象的潜在原因&#xff0c;并揭示随机性如何影响…...

一页概览:统一数据保护方案

2010年左右手绘&#xff0c;用的是公司的信纸&#xff0c;签字笔&#xff0c;马克笔。方案为统一数据保护。其实解释备份软件加备份硬件&#xff08;支持重复数据删除&#xff09;的联合解决方案。...