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

}
相关推荐
程序猿_极客1 分钟前
【2025 最新】 MySQL 数据库安装教程(超详细图文版):从下载到配置一步到位
开发语言·数据库·mysql·mysql数据库安装
2501_945425157 分钟前
C++编译期字符串处理
开发语言·c++·算法
我命由我123457 分钟前
JS 开发问题:url.includes is not a function
开发语言·前端·javascript·html·ecmascript·html5·js
m0_733612219 分钟前
模板编译期哈希计算
开发语言·c++·算法
阿蒙Amon15 分钟前
C#常用类库-详解SqlSugar
开发语言·数据库·c#
似水明俊德18 分钟前
06-C#
开发语言·c++·算法·c#
云栖梦泽20 分钟前
易语言开发从入门到精通:进阶篇·图形图像高级实战
开发语言
程序员小李白20 分钟前
vue2基本语法详细解析(2.7条件渲染)
开发语言·前端·javascript
xyq202423 分钟前
Chart.js 安装指南
开发语言
Predestination王瀞潞26 分钟前
1. Java SE到底是什么:不仅仅是面向对象
java·开发语言