golang websocket 手写研究机制

Go 复制代码
// 处理ws请求
func WsHandler(w http.ResponseWriter, r *http.Request, id string) {
	var conn *websocket.Conn
	var err error
	pingTicker := 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
			}
		}
	}

}
相关推荐
ym hyd 1118 分钟前
宝宝早教服务系统源码 Java+SpringBoot+Vue3 前后分离
java·开发语言·spring boot
看浪的路人16 分钟前
第7讲:实时告警与自动化响应
开发语言·后端·golang
小小龙学IT23 分钟前
Go 语言 database/sql 标准库深度解析:从连接池到驱动抽象
数据库·sql·golang
“AI国潮设计-小江”33 分钟前
Python实战 | SDXL批量生成“潮汕英歌舞”国潮甜品IP,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc
H.莓飛43 分钟前
【数据结构】栈
linux·开发语言·数据结构·算法·centos
无糖可乐没有灵魂1 小时前
用一篇文章来精通“进程/线程/协程/锁“多并发任务
开发语言·php
2601_962885721 小时前
如何用 Python 分析股票的日历效应?(星期效应与月份效应,附数据挖掘陷阱)
开发语言·python·数据挖掘
“AI国潮设计-小江”1 小时前
Python实战 | SDXL批量生成“带炸英歌”国潮IP:从海报到门店落地(附核心Prompt与授权思路)
开发语言·人工智能·python·prompt·aigc
字节渡客1 小时前
PHP项目复盘:foreach 引用残留造成的诡异数据错乱
开发语言·php