分享者:keyunq,來自原文地址
本節(jié)思路
1、redis的go客戶端安裝
2、基于redis的set集合,實現(xiàn)房間的概念,一個房間對應一個set集合,集合內(nèi)保存該房間內(nèi)用戶的唯一標識
我們給每個用戶生成了唯一標識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 于是在發(fā)送消息時,取到redis里某房間內(nèi)所有的uuid,就可以得到對應的websocket鏈接,實現(xiàn)房間內(nèi)的廣播 如果限制房間內(nèi)只有2個用戶,則實現(xiàn)了一對一私聊
安裝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
|