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

}
相关推荐
程序喵大人4 分钟前
推荐个C++高性能内存分配器
开发语言·c++·内存分配
liu****7 分钟前
27.epoll(三)
服务器·开发语言·网络·tcp/ip·udp
福尔摩斯张9 分钟前
Axios源码深度解析:前端请求库设计精髓
c语言·开发语言·前端·数据结构·游戏·排序算法
zephyr0513 分钟前
深入浅出C++多态:从虚函数到动态绑定的完全指南
开发语言·c++
Chef_Chen18 分钟前
数据科学每日总结--Day25--区块链
开发语言·php
L-李俊漩20 分钟前
MMN-MnnLlmChat 启动顺序解析
开发语言·python·mnn
小镇学者28 分钟前
【PHP】PHP WebShell(网页木马)分析
android·开发语言·php
q***697734 分钟前
java进阶1——JVM
java·开发语言·jvm
沐知全栈开发35 分钟前
PHP $_GET 变量详解
开发语言
原神启动11 小时前
云计算大数据——shell教程(三剑客之awk)
大数据·开发语言·perl