案例:使用gorilla/websocket实现聊天室功能
目录:
1、思路分析
2、核心代码
3、所有代码
4、测试代码
5、联系我
一、思路分析
websocket理解为http的升级版本即可
将所有用户抽象成对象User,User中应当包括一个连接和一个消息信道
数据处理器Hub:用于获取到某个用户发送的数据推送给每个用户
二、实现&核心代码
定义User:
type User struct {
conn *websocket.Conn
msg chan []byte
}
定义数据处理器:
type Hub struct {
//用户列表,保存所有用户
userList map[*User]bool
//注册chan,用户注册时添加到chan中
register chan *User
//注销chan,用户退出时添加到chan中,再从map中删除
unregister chan *User
//广播消息,将消息广播给所有连接
broadcast chan []byte
}
数据处理器处理方法:
//处理中心处理获取到的信息
func (h *Hub) run() {
for {
select {
//从注册chan中取数据
case user := <-h.register:
//取到数据后将数据添加到用户列表中
h.userList[user] = true
case user := <-h.unregister:
//从注销列表中取数据,判断用户列表中是否存在这个用户,存在就删掉
if _, ok := h.userList[user]; ok {
delete(h.userList, user)
}
case data := <-h.broadcast:
//从广播chan中取消息,然后遍历给每个用户,发送到用户的msg中
for u := range h.userList {
select {
case u.msg <- data:
default:
delete(h.userList, u)
close(u.msg)
}
}
}
}
}
定义websocket升级器:</