当客户端因为某些问题异常关闭连接时,可以判断关闭连接的异常类型
通过调用websocket.IsCloseError或websocket.IsUnexpectedCloseError即可

if websocket.IsCloseError(err, websocket.Error类型) 
	fmt.Printf("预料到的错误:%s",err.Error())
if websocket.IsUnexpectedcloseError(err) 
	fmt.Printf("未预料的错误")

其中github源码如下

func IsCloseError(err error, codes ...int) bool {
	if e, ok := err.(*CloseError); ok {
		for _, code := range codes {
			if e.Code == code {
				return true
	return false
// IsUnexpectedCloseError returns boolean indicating whether the error is a
// *CloseError with a code not in the list of expected codes.
func IsUnexpectedCloseError(err error, expectedCodes ...int) bool {
	if e, ok := err.(*CloseError); ok {
		for _, code := range expectedCodes {
			if e.Code == code {
				return false
		return true
	return false

异常类型如下

// Close codes defined in RFC 6455, section 11.7.
const (
	CloseNormalClosure           = 1000
	CloseGoingAway               = 1001
	CloseProtocolError           = 1002
	CloseUnsupportedData         = 1003
	CloseNoStatusReceived        = 1005
	CloseAbnormalClosure         = 1006
	CloseInvalidFramePayloadData = 1007
	ClosePolicyViolation         = 1008
	CloseMessageTooBig           = 1009
	CloseMandatoryExtension      = 1010
	CloseInternalServerErr       = 1011
	CloseServiceRestart          = 1012
	CloseTryAgainLater           = 1013
	CloseTLSHandshake            = 1015
 重新连接WebSocket是一个基于的websocket客户端,如果断开连接,它将自动重新连接-线程安全!
go get github.com/recws-org/recws
recws是根据的开源软件。
                                    心跳机制的实现,在客户端连接成功的回调中即开启心跳。心跳处理函数内部使用定时器延时触发向服务端发送消息的方法,待服务器将消息返回证明是连线成功状态下,继续调用心跳检测方法。如果客户端给服务端发送心跳消息,在定义的超时时间后客户端没有收到回复,则说明和服务端断线了,此时会触发到客户端连接关闭的回调函数,在此回调中发起重新连接websocket。
                                    推荐理由Golang官方标准库实现的websocket在功能上有些欠缺,本次介绍的gorilla/websocket库,是Gorilla出品的速度快、质量高,并且被广泛使用的websock...
                                    可以理解为实现这样一种功能:服务器端可以即时地将数据的更新或变化反应到客户端,例如消息推送等功能都是通过这种技术实现的。但是在Web中,由于浏览器的限制,实现即时通讯需要借助一些方法。这种限制出现的主要原因是,一般的Web通信都是浏览器先发送请求到服务器,服务器再进行响应完成数据的现实更新。轮询、长轮询(comet)、长连接(SSE)、WebSocket。它们大体可以分为两类,一种是在HTTP基础上实现的,包括短轮询、长轮询(comet)、长连接(SSE);
                                    在上述示例代码中,我们重写了WebSocketClient的onOpen、onClose和onError方法,在连接建立成功时启动心跳定时器,在连接关闭或发生异常时停止心跳定时器。在心跳定时器中,每隔30秒向服务器发送一条心跳消息。代码问题:如果WebSocketClient的代码有问题,比如说没有正确处理异常或错误情况,可能会导致WebSocketClient断线。网络连接问题:WebSocketClient依赖于网络连接,如果网络连接不稳定或出现故障,可能会导致WebSocketClient断线。
                                    Q:MQTT的开源资源多吗?A:有很多,可以到MQTT的官网查阅(http://www.mqtt.org)。Q:MQTT为什么一般不提供持久化的功能A:mqtt协议里面是按照设备一直在线设计的,数据都是保存在内存里的。Q:MQTT是不是很耗内存?A:MQTT是比较吃内存的,emqtt的实测数据是:38W,内存占14G,CPU 15%。Q:单片机缓存和处理能力有限,消息不能一次性发出去,此时,应该如...
                                    方法将HTTP连接升级为WebSocket连接,并在函数结束时关闭该连接。在此之后,您可以添加您希望在WebSocket连接上执行的其他逻辑。方法,我们等待客户端发送消息。如果读取消息出现错误,我们检查错误类型以确定连接是正常关闭还是异常关闭,并在控制台上打印相应的消息。要在Go语言的后台中监听客户端WebSocket连接的断开事件,您可以使用Gorilla。接下来,我们使用一个无限循环来监听连接的断开事件。这只是一个简单的示例,您可以根据自己的需求进行调整和扩展。在上面的示例中,我们首先通过。
                                    https://blog.svenhetin.com/chu-tan-he-shi-xian-websocketxin-tiao-zhong-lian/https://www.crifan.com/websocket_ping_pong_best_interval_time/https://www.oschina.net/question/137225_27929心跳重连缘由websocket是前...
                                    最近从在写一个课程上报的模块,要求前端使用websocket长连接到后端,实现实时上报学习进度的功能。这次没有使用php或者java,尝试使用一把golang作为上报模块的开发语言。用到了gorm和websocket,这次总结下遇到的坑。
1.websocket无法检测到连接断开
在使用websocket的时候,因为其底层基于tcp连接,所以不执行发送命令是获取不到连接断开的通知的;因此前端发送心跳包到后端,后端可以以返回一个心跳包的形式,判断是否出现err,如果出现err则说明连接断开,处理断开后的逻辑,