|
@@ -2,14 +2,17 @@ package front
|
|
|
|
|
|
import (
|
|
|
"encoding/json"
|
|
|
+ "fmt"
|
|
|
"log"
|
|
|
"net/http"
|
|
|
qutil "qfw/util"
|
|
|
"qfw/util/redis"
|
|
|
"strings"
|
|
|
+ "sync"
|
|
|
"time"
|
|
|
|
|
|
- //"github.com/go-xweb/xweb"
|
|
|
+ "github.com/go-xweb/httpsession"
|
|
|
+ "github.com/go-xweb/xweb"
|
|
|
"github.com/gorilla/websocket"
|
|
|
)
|
|
|
|
|
@@ -18,72 +21,152 @@ var upgrader = websocket.Upgrader{
|
|
|
WriteBufferSize: 1024,
|
|
|
}
|
|
|
|
|
|
+//socket对象放在内存中,待rpc回调使用
|
|
|
+type Wss struct {
|
|
|
+ Conn *websocket.Conn
|
|
|
+ Time int64
|
|
|
+}
|
|
|
+type MapSocket struct {
|
|
|
+ Map map[string]*Wss
|
|
|
+ Lock sync.Mutex
|
|
|
+}
|
|
|
+
|
|
|
+func (m *MapSocket) GC() {
|
|
|
+ defer qutil.Catch()
|
|
|
+ m.Lock.Lock()
|
|
|
+ now := time.Now().Unix()
|
|
|
+ for k, v := range m.Map {
|
|
|
+ if now-v.Time > 3600 || v.Conn == nil {
|
|
|
+ delete(m.Map, k)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ m.Lock.Unlock()
|
|
|
+ time.AfterFunc(5*time.Minute, m.GC)
|
|
|
+}
|
|
|
+
|
|
|
+var MSPOOL = 20
|
|
|
+var MapSocketArr = make([]*MapSocket, MSPOOL)
|
|
|
+
|
|
|
+//初始化
|
|
|
+func init() {
|
|
|
+ for i := 0; i < MSPOOL; i++ {
|
|
|
+ ms := &MapSocket{Map: map[string]*Wss{}}
|
|
|
+ go ms.GC()
|
|
|
+ MapSocketArr[i] = ms
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//根据代码和ws做映射
|
|
|
+func PutWsByCode(src string, ws *websocket.Conn) {
|
|
|
+ defer qutil.Catch()
|
|
|
+ n := HashVal(src) % MSPOOL
|
|
|
+ ms := MapSocketArr[n]
|
|
|
+ ms.Lock.Lock()
|
|
|
+ ms.Map[src] = &Wss{ws, time.Now().Unix()}
|
|
|
+ ms.Lock.Unlock()
|
|
|
+}
|
|
|
+
|
|
|
+//计算代码的hash值
|
|
|
+func HashVal(src string) int {
|
|
|
+ check := 0
|
|
|
+ for i := len(src) / 2; i < len(src); i++ {
|
|
|
+ check += int(src[i])
|
|
|
+ }
|
|
|
+ return check
|
|
|
+}
|
|
|
+
|
|
|
+//rpc回调,写到前台
|
|
|
+func GetWsByCode(param []string) bool {
|
|
|
+ if len(param) < 2 {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ src := param[0]
|
|
|
+ openid := param[1]
|
|
|
+ if src == "" {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ defer qutil.Catch()
|
|
|
+ n := HashVal(src) % MSPOOL
|
|
|
+ ms := MapSocketArr[n]
|
|
|
+ defer func() {
|
|
|
+ ms.Lock.Lock()
|
|
|
+ delete(ms.Map, src)
|
|
|
+ ms.Lock.Unlock()
|
|
|
+ }()
|
|
|
+ ms.Lock.Lock()
|
|
|
+ wss := ms.Map[src]
|
|
|
+ ms.Lock.Unlock()
|
|
|
+ if wss != nil && wss.Conn != nil {
|
|
|
+ infoData := LoginInfo(src, openid, wss.Conn.Sess)
|
|
|
+ sendmessage, _ := json.Marshal(infoData)
|
|
|
+ if err := wss.Conn.WriteMessage(websocket.TextMessage, sendmessage); err != nil {
|
|
|
+ log.Println("socket send fail..", err)
|
|
|
+ return false
|
|
|
+ } else {
|
|
|
+ wss.Conn.Close()
|
|
|
+ }
|
|
|
+ return true
|
|
|
+ } else {
|
|
|
+ return false
|
|
|
+
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//用户登录信息
|
|
|
+func LoginInfo(shareid, openid string, Sess interface{}) (infoData map[string]interface{}) {
|
|
|
+ if Sess == nil {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ sess, _ := Sess.(*httpsession.Session)
|
|
|
+ infoData = make(map[string]interface{})
|
|
|
+ if openid != "" {
|
|
|
+ redisheadimg := redis.Get("other", "newUser-"+openid)
|
|
|
+ if redisheadimg == nil {
|
|
|
+ redisheadimg = ""
|
|
|
+ }
|
|
|
+ user, _ := mongodb.FindOneByField("user", `{"s_m_openid":"`+openid+`"}`, `{"s_nickname":1,"s_headimage":1,"s_m_openid":1}`)
|
|
|
+ if user != nil && len(*user) > 0 {
|
|
|
+ infoData["result"] = "ok"
|
|
|
+ infoData["s_nickname"] = fmt.Sprint((*user)["s_nickname"])
|
|
|
+ infoData["s_headimage"] = fmt.Sprint((*user)["s_headimage"])
|
|
|
+ infoData["redisheadimg"] = fmt.Sprint(redisheadimg)
|
|
|
+ infoData["encryptId"] = se.EncodeString(qutil.BsonIdToSId((*user)["_id"]))
|
|
|
+ infoData["shareid"] = shareid
|
|
|
+ (*user)["shareid"] = shareid
|
|
|
+ nick := fmt.Sprint((*user)["s_nickname"])
|
|
|
+ sess.Set("nickname", nick)
|
|
|
+ sess.Set("s_nickname", nick)
|
|
|
+ sess.Set("s_m_openid", fmt.Sprint((*user)["s_m_openid"]))
|
|
|
+ sess.Set("user", *user)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return infoData
|
|
|
+}
|
|
|
+
|
|
|
//登录关注
|
|
|
func ServeWss(w http.ResponseWriter, r *http.Request) {
|
|
|
defer qutil.Catch()
|
|
|
conn, err := upgrader.Upgrade(w, r, nil)
|
|
|
+ conn.Sess = xweb.RootApp().SessionManager.Session(r, w)
|
|
|
var shareIds string
|
|
|
- var shareid = ""
|
|
|
- var openid = ""
|
|
|
- go func() {
|
|
|
+ if err == nil {
|
|
|
for {
|
|
|
_, shareData, err := conn.ReadMessage()
|
|
|
if err != nil {
|
|
|
log.Println("前台socket关闭,后台socket断开并退出循环。。。。")
|
|
|
- shareIds = "close"
|
|
|
- return
|
|
|
- }
|
|
|
- shareIds = string(shareData)
|
|
|
- if shareIds == "close" {
|
|
|
- return
|
|
|
+ break
|
|
|
+ } else {
|
|
|
+ shareIds = string(shareData)
|
|
|
+ shareidlist := strings.Split(shareIds, "___")
|
|
|
+ if shareIds != "" && len(shareidlist) > 1 {
|
|
|
+ shareidnum := shareidlist[0]
|
|
|
+ shareidkop := shareidlist[1]
|
|
|
+ PutWsByCode(se.DecodeString(shareidnum), conn)
|
|
|
+ PutWsByCode(se.DecodeString(shareidkop), conn)
|
|
|
+ }
|
|
|
}
|
|
|
- //log.Println("shareData:", shareIds, "---")
|
|
|
}
|
|
|
- }()
|
|
|
- for {
|
|
|
- time.Sleep(1 * time.Second)
|
|
|
- if shareIds == "close" {
|
|
|
- //log.Println("!!!!socket关闭!!!退出循环")
|
|
|
- conn.Close()
|
|
|
- return
|
|
|
- } else if shareIds == "" {
|
|
|
- continue
|
|
|
- }
|
|
|
- shareidlist := strings.Split(shareIds, "___")
|
|
|
- if shareIds != "" && len(shareidlist) > 1 {
|
|
|
- shareidnum := strings.Split(shareIds, "___")[0]
|
|
|
- shareidkop := strings.Split(shareIds, "___")[1]
|
|
|
- //log.Println(se.DecodeString(shareidnum) + "--1--" + se.DecodeString(shareidkop))
|
|
|
- shareid = shareidnum
|
|
|
- openid = redis.GetStr("sso", "p_usershare_"+se.DecodeString(shareidnum))
|
|
|
- if openid == "" {
|
|
|
- openid = redis.GetStr("sso", "p_usershare_"+se.DecodeString(shareidkop))
|
|
|
- shareid = shareidkop
|
|
|
- }
|
|
|
- if openid == "" {
|
|
|
- shareid = ""
|
|
|
- }
|
|
|
- }
|
|
|
- if shareid == "" {
|
|
|
- continue
|
|
|
- }
|
|
|
- sendmessage, _ := json.Marshal(shareid)
|
|
|
- if err := conn.WriteMessage(websocket.TextMessage, sendmessage); err != nil {
|
|
|
- log.Println("socket send fail..", err)
|
|
|
- }
|
|
|
- if shareid != "" {
|
|
|
- //log.Println("登录后正常关闭!!!")
|
|
|
- conn.Close()
|
|
|
- return
|
|
|
- }
|
|
|
- }
|
|
|
- //sess := xweb.RootApp().SessionManager.Session(r, w)
|
|
|
- //log.Println("sess-id:", sess.Id())
|
|
|
- if err != nil {
|
|
|
- log.Println(err)
|
|
|
- return
|
|
|
}
|
|
|
- //conn.Ch = make(chan bool, 1)
|
|
|
}
|
|
|
|
|
|
//实验室
|