{"title":"使用Golang Beego优化WebSocket代码:修复并提升性能","description":"本示例展示如何使用Golang Beego框架优化WebSocket代码,包括修复错误、提升性能、提高代码可读性等。","keywords":"Golang, Beego, WebSocket, 优化, 代码修复, 性能提升","content":"{"package":"main","import":{["encoding/base64","encoding/json","fmt","net/http","time","github.com/astaxie/beego","github.com/gorilla/websocket"]},"const":{["maxMessageSize":5120000]},"type":{["VoiceDriverCtl":{["beego.Controller"]}]},"func":{["(this *VoiceDriverCtl) onForbidden()":{["this.Ctx.Output.SetStatus(401)","this.Ctx.Output.Body([]byte("Forbidden"))","this.StopRun()"]},"(this *VoiceDriverCtl) OnDemo()":{["if !this.Ctx.Input.IsWebsocket() {","this.onForbidden()","return"},"OnModelVoiceDriverSocket(this.Ctx.ResponseWriter, this.Ctx.Request)"]},"OnModelVoiceDriverSocket(resp http.ResponseWriter, req *http.Request)":{["remoteAddr := req.RemoteAddr","commonInfo := fmt.Sprintf("OnModelVoiceDriverSocket, ip = %s", remoteAddr)","var upgrader = websocket.Upgrader{","ReadBufferSize: 1024","WriteBufferSize: 1024","CheckOrigin: func(r *http.Request) bool {","return true"},"},"wsSocket, err := upgrader.Upgrade(resp, req, nil)","if err != nil {","beego.Error("%s, 升级为websocket失败, err = %v", commonInfo, err.Error())","return"},"wsSocket.SetReadLimit(maxMessageSize)","beego.Info("%s, is connected", commonInfo)","defer func() {","beego.Info("%s, is disconnected", commonInfo)","wsSocket.Close()"},"()","for {",", data, err := wsSocket.ReadMessage()","if err != nil {","beego.Error("%s, read message error, %v", commonInfo, err.Error())","return"},"beego.Info("%s, recv: %s", commonInfo, string(data))","err = sendToSta(data)","if err != nil {","fmt.Println("Failed to send message to third party:", err)"},"},"},"sendToSta(msg []byte) error":{["commonInfo := fmt.Sprintf("sendToSta")","var message protocol.STAReq","err := json.Unmarshal(msg, &message)","if err != nil {","beego.Error("%s, read: %s, err = %v", commonInfo, string(msg), err)","return err"},"if message.Input == "" {","beego.Error("%s,无效参数", commonInfo)","return fmt.Errorf("%s,无效参数", commonInfo)"},"beego.Info("sendToSta, gender=%d, flag=%d, input=%s", message.Gender, message.Flag, message.Input)","conn, resp, err := websocket.DefaultDialer.Dial(appconf.TTSStaApi, nil)","if err != nil {","beego.Info("OnModelVoiceDriver OnSocket dial error: %v", err)","return err"},"defer conn.Close()","beego.Info("OnModelVoiceDriver OnSocket ws resp: Status=%s, StatusCode=%d, Proto=%s",","resp.Status, resp.StatusCode, resp.Proto)","var strSlice []string","header := ModelStaHeader1(message.Gender)","body := ModelStaBody1(message.Input)","sendData := map[string]interface{}{"head": header, "data": body}","sendDataBytes, _ := json.Marshal(sendData)","err = conn.WriteMessage(websocket.TextMessage, sendDataBytes)","if websocket.IsCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {","beego.Info("OnModelVoiceDriver Connection closed")","return err"},"else if err != nil {","beego.Error("OnModelVoiceDriver Error sending audio data:", err)"},"var bsFrames [][]int32","var orderStr [][]string","for {",", msg, err := conn.ReadMessage()","if websocket.IsCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {","beego.Info(" OnModelVoiceDriver Connection closed")","return err"},"else if err != nil {","beego.Error("OnModelVoiceDriver read error: %v", err)","return err"},"var res protocol.ModelSTARes","err = json.Unmarshal(msg, &res)","if err != nil {","beego.Error("receiveData, Parse JSON response and handle data,err: ", err)","return err"},"switch res.Code {","case 200:","if len(res.Data.VesAnimeResult.Order) == 0 {","beego.Error("Failed to get VesAnimeResult.Order: %v", err)","return err"},"if len(res.Data.VesAnimeResult.Frame[0]) == 0 {","beego.Error("res.Data.VesAnimeResult.Frame: %v", err)","return err"},"if res.Data.VesAnimeResult.Coefl == 0 {","beego.Error("res.Data.VesAnimeResult.Coefl: %v", err)","return err"},"bsFrames = append(bsFrames, res.Data.VesAnimeResult.Frame...)","orderStr = append(orderStr, res.Data.VesAnimeResult.Order)","content, err := base64.StdEncoding.DecodeString(res.Data.Content)","if err != nil {","beego.Error("res.Data.Content decode error: %v", err)"},"strSlice = append(strSlice, string(content))","default:","beego.Error("Received response code: %d", res.Code)","},"if res.Data.IsLast && res.Data.IsFinish {","conn.Close()","break"},"time.Sleep(10 * time.Millisecond)","},"if len(strSlice) == 0 {","beego.Error("音频数据为空")"},"beego.Info("OnModelVoiceDriver,orderStr: %v", orderStr)","byteSlice := FixFiles(strSlice)","wavStr := base64.StdEncoding.EncodeToString(byteSlice)","go HandelModelData(bsFrames, 10000, this.Token, commonInfo, message.Seq)","beego.Info("%s, finish", commonInfo)","time.Sleep(3 * time.Millisecond)","if message.Flag == 1 {","this.OnAddText(&message)"},"result := make(map[string]interface{})","if len(wavStr) != 0 {","result["audio"] = wavStr"},"return nil"},"main()":{["beego.Router("/demo", &VoiceDriverCtl{}, "get:OnDemo")","beego.Run()"]}]}

使用Golang Beego优化WebSocket代码:修复并提升性能

原文地址: https://www.cveoy.top/t/topic/pWLs 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录