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

}
相关推荐
lly2024068 分钟前
SOAP 简介
开发语言
小王不爱笑13219 分钟前
Java 对象拷贝(浅拷贝 / 深拷贝)
java·开发语言·python
ℳ๓₯㎕.空城旧梦39 分钟前
C++中的解释器模式
开发语言·c++·算法
JdayStudy1 小时前
SIR 网络传播仿真软件说明书
开发语言·网络·php
有点傻的小可爱1 小时前
【MATLAB】新安装并口如何实现能通过PTB启用?
开发语言·windows·经验分享·matlab
符哥20081 小时前
充电桩 WiFi 局域网配网(Android/Kotlin)流程、指令及实例说明文档
android·开发语言·kotlin
weixin_456321641 小时前
Java架构设计:Redis持久化方案整合实战
java·开发语言·redis
2401_879503411 小时前
C++与FPGA协同设计
开发语言·c++·算法
asom222 小时前
DDD(领域驱动设计) 核心概念详解
java·开发语言·数据库·spring boot
oem1102 小时前
C++中的访问者模式变体
开发语言·c++·算法