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

}
相关推荐
代码中介商3 小时前
C++左值与右值:核心判断法则详解
开发语言·c++
JAVA9653 小时前
JAVA面试-并发篇 05-并发包AQS队列实现原理是什么
java·开发语言·面试
Halo_tjn4 小时前
反射与设计模式1
java·开发语言·算法
珊瑚里的鱼4 小时前
手撕单例模式中的饿汉模式和懒汉模式,懒汉模式还要再多加一个C++11版本的
开发语言·c++·单例模式
_不会dp不改名_5 小时前
python-opencv环境搭建
开发语言·python·opencv
HappyAcmen5 小时前
9.复盘API全套流程
开发语言·python
charlie1145141915 小时前
通用GUI编程技术——图形渲染实战(四十五)——D3D12资源与堆管理:从上传到驻留
开发语言·3d·图形渲染·win32
不会C语言的男孩5 小时前
C++ Primer 第12章:动态内存
开发语言·c++
踏着七彩祥云的小丑5 小时前
Go学习第1天:入门
开发语言·学习·golang·go
眠りたいです6 小时前
现代C++:C++17中的新库特性
开发语言·c++·c++20·c++17