分享者:keyunq,来自原文地址 本节思路1、redis的go客户端安装 2、基于redis的set集合,实现房间的概念,一个房间对应一个set集合,集合内保存该房间内用户的唯一标识 我们给每个用户生成了唯一标识uuid(后期接入微信小程序,则可以使用微信用户openid代替),于是set集合大致如下: 房间1 用户A-uuid 用户B-uuid ...... 房间2 用户C-uuid 用户D-uuid ...... ...... 3、用户的uuid,又对应着go服务端里面的一个map ActiveClients = make(map[string]ClientConn)
该map以用户的uuid为key,在线用户的websocket链接为value 于是在发送消息时,取到redis里某房间内所有的uuid,就可以得到对应的websocket链接,实现房间内的广播 如果限制房间内只有2个用户,则实现了一对一私聊 安装redis的go客户端go get -u github.com/go-redis/redis
服务器端go代码: package main import ( "golang.org/x/net/websocket" "fmt" "log" "net/http" "github.com/go-redis/redis" "encoding/json" )
var ( JSON = websocket.JSON // codec for JSON Message = websocket.Message // codec for string, []byte ActiveClients = make(map[string]ClientConn) // map containing clients User = make(map[string]string) )
type ClientConn struct { websocket *websocket.Conn }
type UserMsg struct { Room string Cmd string User string Content string Uuid string }
func echoHandler(ws *websocket.Conn) { var err error var userMsg UserMsg
for {
var data []byte if err = websocket.Message.Receive(ws, &data); err != nil { fmt.Println("can't receive") break }
err = json.Unmarshal(data, &userMsg) fmt.Println(userMsg)
go wsHandler(ws,userMsg)
}
}
func wsHandler(ws *websocket.Conn,userMsg UserMsg) { sockCli := ClientConn{ws} var err error
redisClient := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password set DB: 0, // use default DB })
//登录 if userMsg.Cmd == "login" { fmt.Println("login") //用户列表新增当前用户 ActiveClients
|