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

}
相关推荐
‎ദ്ദിᵔ.˛.ᵔ₎5 小时前
c++11:fuction包装器
开发语言·c++
kimnoic5 小时前
Python 爬虫的原理
开发语言·python
Fluxproxy5 小时前
Python爬虫异步提速终极方案|线程池ThreadPoolExecutor实战,告别单线程慢速爬取
开发语言·爬虫·python
淡海水5 小时前
02-07-原理篇-GC暂停时间的本质
开发语言·unity·c#·gc·暂停时间
北i6 小时前
Dubbo 默认超时重试:把下游打雪崩的隐形放大器
开发语言·qt·dubbo
10mAh6 小时前
【Java】ArrayList 遍历删除为什么报错?三种写法与漏删复现
java·开发语言·windows
wewowilling6 小时前
AI大模型开发--01Python基础(无废话)
开发语言·python·函数
小羊没烦恼!7 小时前
OS X 上使用.NET开发应用程序
开发语言·前端·数据库·人工智能·c#·策略模式
棉猴7 小时前
玩游戏学Python5-函数
开发语言·python·函数·玩游戏·游戏编程
谢亮_vipxieliang7 小时前
JavaScript this 指向完全指南:调用位置决定一切
开发语言·javascript·ecmascript