跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • golang 使用 websocket 发送数据给前端,总是会有丢包的情况发生
未分類
11 9 月 2020

golang 使用 websocket 发送数据给前端,总是会有丢包的情况发生

golang 使用 websocket 发送数据给前端,总是会有丢包的情况发生

資深大佬 : swqslwl 6

报错有时是 write:broken pipe. 有时是 An established connection was aborted by the software in your host machine. 有时不报错,wrieshark 抓包发现包全部发出去了,但前端就是会丢包。

上个帖子犯了个低级错误用了共享内存变量,现在改为用 channel 了,想知道是不是还是我后端代码的问题。

如果有提供很大帮助思路的,小弟可以给予一定的酬谢。

var dataTmp = make(chan []byte, 9999) var t = make(chan []byte, 9999)  var upgrader = websocket.Upgrader{  // ReadBufferSize: 1024,  WriteBufferSize: 1024,  // 允许所有的 CORS 跨域请求,正式环境可以关闭  CheckOrigin: func(r *http.Request) bool {   return true  }, }  func init() {  http.HandleFunc("/ws", wsHandler)  go http.ListenAndServe("173.10.10.100:88", nil) }  func wsHandler(resp http.ResponseWriter, req *http.Request) {  // 答客户端告知升级连接为 websocket  wsSocket, err := upgrader.Upgrade(resp, req, nil)  if err != nil {   fmt.Println("升级为 websocket 失败", err.Error())   return  }  go wsWriteLoop(wsSocket) }  // 发送消息给客户端 func wsWriteLoop(wsConn *websocket.Conn) {  for {   select {   case terror := <-t:    fmt.Println("错误重新发送")    fmt.Println(terror)    err := wsConn.WriteMessage(websocket.TextMessage, terror)    if err != nil {     fmt.Println("再次发送", err.Error())     t <- terror     return    }    case tmp := <-dataTmp:    err := wsConn.WriteMessage(websocket.TextMessage, tmp)    if err != nil {     fmt.Println("发送消息给客户端发生错误", err.Error())     t <- tmp     return    }   }  } } 

大佬有話說 (10)

  • 資深大佬 : xkeyideal

    既然主大大方方的说要给酬劳了,那么就先说说能给多少吧。
    这段代码呢,在某些环境下没有问题,也看不出问题;但其实槽点慢慢,可以给你一份比较完整的 golang websocket 的处理代码,至于能不能解决你说的问题不清楚,你这种问题个人从来没遇到

  • 資深大佬 : bjt

    主怕是想错了,这个不是丢包,就是网络中断。你本地送出去了并不代表对方能收到。

  • 資深大佬 : est

    一般的设计不是解决丢包,而是在承认丢包的前提下再多发几遍。。。

  • 資深大佬 : xx6412223

    先把逻辑写正确吧。还所有连接共用一个错误 channel

  • 資深大佬 : sujin190

    你手动这两错误本身就是正常的吧,你这个 for 是死循环的,又没有检查 websocket 连接是否断开的情况,如果前端有异常断开了你再写就会返回这个错误啊,前端断开一般会重连,所以你应该断开后数据就保存再 chan 中,重连之后再往新的连接中写,具体是不是这样和为啥断开不行可以抓包仔细看看

  • 資深大佬 : des

    你这两个报错,就是网络连接断开了,不是前端丢包的问题

  • 資深大佬 : joesonw

    websocket 协议保证了你收到的 frame 就是完整的没拆开的 frame. 如果丢包了肯定不是代码的问题, 而是库的问题(发送端 /接收端)

  • 資深大佬 : wysnylc

    惨

  • 資深大佬 : xdeng

    9999 就很不程序员了

  • 資深大佬 : suke971219

    https://github.com/Treblex/easyStart/blob/master/server/router/api/ws/chat/server.go

    最近也在学 go,可以看下有没有帮助,
    预览地址 https://go.abadboy.cn/ws/

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具