|
@@ -7,6 +7,7 @@ import (
|
|
qutil "qfw/util"
|
|
qutil "qfw/util"
|
|
"qfw/util/redis"
|
|
"qfw/util/redis"
|
|
"strings"
|
|
"strings"
|
|
|
|
+ "sync"
|
|
"time"
|
|
"time"
|
|
|
|
|
|
//"github.com/go-xweb/xweb"
|
|
//"github.com/go-xweb/xweb"
|
|
@@ -18,72 +19,170 @@ var upgrader = websocket.Upgrader{
|
|
WriteBufferSize: 1024,
|
|
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(src string) bool {
|
|
|
|
+ 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()
|
|
|
|
+ sendmessage, _ := json.Marshal(src)
|
|
|
|
+ if err := wss.Conn.WriteMessage(websocket.TextMessage, sendmessage); err != nil {
|
|
|
|
+ log.Println("socket send fail..", err)
|
|
|
|
+ return false
|
|
|
|
+ } else {
|
|
|
|
+ //log.Println("登录后正常关闭!!!")
|
|
|
|
+ wss.Conn.Close()
|
|
|
|
+ }
|
|
|
|
+ return true
|
|
|
|
+}
|
|
|
|
+
|
|
//登录关注
|
|
//登录关注
|
|
func ServeWss(w http.ResponseWriter, r *http.Request) {
|
|
func ServeWss(w http.ResponseWriter, r *http.Request) {
|
|
defer qutil.Catch()
|
|
defer qutil.Catch()
|
|
conn, err := upgrader.Upgrade(w, r, nil)
|
|
conn, err := upgrader.Upgrade(w, r, nil)
|
|
var shareIds string
|
|
var shareIds string
|
|
- var shareid = ""
|
|
|
|
- var openid = ""
|
|
|
|
- go func() {
|
|
|
|
|
|
+ //var shareid = ""
|
|
|
|
+ //var openid = ""
|
|
|
|
+ if err == nil {
|
|
for {
|
|
for {
|
|
_, shareData, err := conn.ReadMessage()
|
|
_, shareData, err := conn.ReadMessage()
|
|
if err != nil {
|
|
if err != nil {
|
|
log.Println("前台socket关闭,后台socket断开并退出循环。。。。")
|
|
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(shareidnum, conn)
|
|
|
|
+ PutWsByCode(shareidkop, conn)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
//log.Println("shareData:", shareIds, "---")
|
|
//log.Println("shareData:", shareIds, "---")
|
|
}
|
|
}
|
|
- }()
|
|
|
|
- for {
|
|
|
|
- time.Sleep(2 * 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)
|
|
|
|
|
|
+ // go func() {
|
|
|
|
+ // for {
|
|
|
|
+ // _, shareData, err := conn.ReadMessage()
|
|
|
|
+ // if err != nil {
|
|
|
|
+ // log.Println("前台socket关闭,后台socket断开并退出循环。。。。")
|
|
|
|
+ // shareIds = "close"
|
|
|
|
+ // return
|
|
|
|
+ // }
|
|
|
|
+ // shareIds = string(shareData)
|
|
|
|
+ // if shareIds == "close" {
|
|
|
|
+ // return
|
|
|
|
+ // }
|
|
|
|
+ // //log.Println("shareData:", shareIds, "---")
|
|
|
|
+ // }
|
|
|
|
+ // }()
|
|
|
|
+ // for {
|
|
|
|
+ // time.Sleep(2 * 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)
|
|
|
|
+ // }
|
|
}
|
|
}
|
|
|
|
|
|
//实验室
|
|
//实验室
|