分享者: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")
//用户列表新增当前用户