package websocket import ( "encoding/json" "github.com/gorilla/websocket" "locking-kit-server/handler" "log" "net/http" ) /** * @author yuanrh * @description http转websocket协议 * @date 2021/6/28 11:11 **/ var( upgrader = websocket.Upgrader{ //允许跨域访问 CheckOrigin: func(r *http.Request) bool { return true }, } ) //订阅同步任务 func SubscriptionTaskSyncHandler(w http.ResponseWriter, r *http.Request){ //w.Write([]byte("hello")) //收到http请求(upgrade),完成websocket协议转换 //在应答的header中放上upgrade:websoket var ( conn *websocket.Conn err error //msgType int //data []byte ) if conn, err = upgrader.Upgrade(w, r, nil); err !=nil { //报错了,直接返回底层的websocket链接就会终断掉 return } //得到了websocket.Conn长连接的对象,实现数据的收发 for { //Text(json), Binary //if _, data, err = conn.ReadMessage(); err != nil { if _, _, err = conn.ReadMessage(); err != nil { log.Println(err) //报错关闭websocket goto ERR } //发送数据,判断返回值是否报错 //log.Println("param subscriptionFileChangeHandler:"+string(data)) err = handler.SubscriptionTaskSyncHandler(conn) if err != nil { //报错了 log.Println(err) goto ERR } } //error的标签 ERR: conn.Close() } //订阅同步任务 func SubscriptionMessageNotifyHandler(w http.ResponseWriter, r *http.Request){ //w.Write([]byte("hello")) //收到http请求(upgrade),完成websocket协议转换 //在应答的header中放上upgrade:websoket var ( conn *websocket.Conn err error //msgType int //data []byte ) if conn, err = upgrader.Upgrade(w, r, nil); err !=nil { //报错了,直接返回底层的websocket链接就会终断掉 return } //得到了websocket.Conn长连接的对象,实现数据的收发 for { //Text(json), Binary //if _, data, err = conn.ReadMessage(); err != nil { if _, _, err = conn.ReadMessage(); err != nil { log.Println(err) //报错关闭websocket goto ERR } //发送数据,判断返回值是否报错 //log.Println("param subscriptionFileChangeHandler:"+string(data)) //监听消息 go func() { handler.ListeningRemoteMessage() }() for message := range handler.MessageToWebChanel { data,err := json.Marshal(message) if err !=nil{ log.Print(err) goto ERR } if err := conn.WriteMessage(websocket.TextMessage, data); err != nil { log.Printf("监听同步任务失败,%v", err) goto ERR } } if err != nil { //报错了 log.Println(err) goto ERR } goto ERR } //error的标签 ERR: conn.Close() }