分享者: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
|