Golang Go语言使用 websocket 发送数据给前端总是会有丢包的情况发生

发布于 1周前 作者 itying888 来自 Go语言

Golang Go语言使用 websocket 发送数据给前端总是会有丢包的情况发生

报错有时是 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 := &lt;-dataTmp:
		err := wsConn.WriteMessage(websocket.TextMessage, tmp)
		if err != nil {
			fmt.Println("发送消息给客户端发生错误", err.Error())
			t &lt;- tmp
			return
		}
	}
}

}


更多关于Golang Go语言使用 websocket 发送数据给前端总是会有丢包的情况发生的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

12 回复

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

更多关于Golang Go语言使用 websocket 发送数据给前端总是会有丢包的情况发生的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


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

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

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

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

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

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

9999 就很不程序员了

基于 tcp 协议的协议是不会丢包的。题主在开始编程工作之前应当好好学习计算机基础知识

针对您在使用Golang的Websocket发送数据给前端时遇到的丢包问题,以下是一些专业建议:

  1. 使用缓存区:由于Websocket是异步传输,可以使用缓存区(如Go中的channel)来保存数据。在数据丢失时,可以从缓存区中重传数据。
  2. 实现数据分片:Websocket数据包大小有限制,超出限制的数据包会被切割。实现数据分片,将数据切割成多个小片段传输,可以减少因数据包过大导致的丢失风险。
  3. 添加校验信息:在数据包中添加校验信息,接收方根据校验信息进行验证。如果校验失败,要求发送方重发数据包。
  4. 消息确认机制:为每条消息添加唯一标识符,接收方收到消息后发送确认消息。发送方在一定时间内未收到确认消息时,重新发送该消息。
  5. 心跳机制:定时发送心跳消息以检测连接状态。如果一段时间内未收到心跳回复,则认为连接已断开,可以及时重连或采取其他措施。

通过实施以上建议,可以有效降低Websocket通信中的丢包率。如果问题仍然存在,建议检查网络状况、Websocket服务器配置以及前端接收逻辑等方面,以找到并解决问题的根源。

回到顶部