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
			}
		}
	}

}
相关推荐
java1234_小锋1 分钟前
Java进程突然挂了如何排查?
java·开发语言
admiraldeworm1 小时前
c -> true 导致异常返回 404 问题排查
c语言·开发语言
qq_375916371 小时前
kettle菜鸟教程
开发语言·kettle
qq_254674411 小时前
Alpine Linux 基于 Debian 等系统的常规 Nginx
开发语言
故事和你911 小时前
洛谷-数据结构2-1-二叉堆与树状数组1
开发语言·数据结构·c++·算法·动态规划·图论
挨踢ren2 小时前
C++虚函数:从基础到高阶
java·开发语言·jvm
hhb_6182 小时前
C语言核心技术难点梳理与实战案例解析
c语言·开发语言
海参崴-2 小时前
C++ STL篇 红黑树的模拟实现
开发语言·c++
Dshuishui2 小时前
我用 Claude Code 做了一个学术论文搜索工具
开发语言·人工智能·python·pip·uv
Resky08182 小时前
ReentrantReadWriteLock 深度解析
java·开发语言·juc