golang websocket 手写研究机制

devtools/2024/11/15 8:40:21/
// 处理ws请求
func WsHandler(w http.ResponseWriter, r *http.Request, id string) {var conn *websocket.Connvar err errorpingTicker := time.NewTicker(time.Second * 10)conn, err = wsupgrader.Upgrade(w, r, nil)if err != nil {log.Printf("Failed to set websocket upgrade: %+v", err)return}addClient(id, conn)m, exist := getMessageChannel(id)if !exist {m = make(chan interface{})addMessageChannel(id, m)}conn.SetCloseHandler(func(code int, text string) error {deleteClient(id)fmt.Println(code)return nil})for {select {case content, ok := <-m:err = conn.WriteJSON(content)if err != nil {log.Println(err)if ok {go func() {m <- content}()}conn.Close()deleteClient(id)return}case <-pingTicker.C:conn.SetWriteDeadline(time.Now().Add(time.Second * 20))if err := conn.WriteMessage(websocket.PingMessage, []byte{}); err != nil {log.Println("send ping err:", err)conn.Close()deleteClient(id)return}}}}


http://www.ppmy.cn/devtools/86433.html

相关文章

CANoe在使用时碰到的一些很少见的Bug

CANoe作为一款成熟且稳定的总线仿真与测试工具&#xff0c;深受汽车工程师们的喜爱。CANoe虽然稳定&#xff0c;但作为一个软件来说&#xff0c;在使用中总会出现一些或大或小的Bug。最近全球范围内的大规模蓝屏事件&#xff0c;是由某个安全软件引起的。而很多CANoe使用者最近…

钉钉小程序内部跳转

1.跳转小程序携带参数 //触发跳转事件的方法 handleJump() {dd.navigateToMiniProgram({// 需要跳转的小程序的appIdappId: XXXXXXXXXXXXXXX,//需要跳转的小程序的页面path: pages/func/camera/camera,//参数extraData: {isOutSide: "1"},success: (res) > {cons…

ComfyUI插件:ComfyUI Impact 节点(四)

前言&#xff1a; 学习ComfyUI是一场持久战&#xff0c;而 ComfyUI Impact 是一个庞大的模块节点库&#xff0c;内置许多非常实用且强大的功能节点 &#xff0c;例如检测器、细节强化器、预览桥、通配符、Hook、图片发送器、图片接收器等等。通过这些节点的组合运用&#xff0…

昇思MindSpore 应用学习-基于MindSpore的GPT2文本摘要

基于MindSpore的GPT2文本摘要 --AI代码解析 数据集加载与处理 数据集加载 本次实验使用的是nlpcc2017摘要数据&#xff0c;内容为新闻正文及其摘要&#xff0c;总计50000个样本。 from mindnlp.utils import http_get # 导入http_get模块&#xff0c;用于下载数据集# downl…

使用Echarts来实现数据可视化

目录 一.什么是ECharts? 二.如何使用Springboot来从后端给Echarts返回响应的数据&#xff1f; eg:折线图&#xff1a; ①Controller层&#xff1a; ②service层&#xff1a; 一.什么是ECharts? ECharts是一款基于JavaScript的数据可视化图标库&#xff0c;提供直观&…

【echarts】 柱状图,最后带“竖线”

具体&#xff1a; https://echarts.zhangmuchen.top/#/detail?cid28ea6-0601-e9f5-9cc29-c022b758 let data [{value: 0,name: 数据格式一},{value: 55,name: 数据格式二},{value: 66,name: 数据格式三},{value: 75,name: 数据格式四},{value: 20,name: 数据格式五}];getAr…

FastAPI(七十八)实战开发《在线课程学习系统》接口开发-- 评论

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 梳理下思路 1.判断是否登录 2.课程是否存在 3.如果是回复&#xff0c;查看回复是否存在 4.是否有权限 5.发起评论 首先新增pydantic模型 class Cour…

『 Linux 』信号的写入与保存

文章目录 信号的发送信号的保存sigset_t 类型与信号集操作函数阻塞信号集(信号屏蔽字)操作函数未决信号集操作函数验证阻塞信号集与未决信号集 信号的发送 $ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10)…