write tcp 127.0.0.1:8080->127.0.0.1:45748: write: broken pipe

当使用goframe实现WebSocket时,长时间未向客户端发送数据会导致前端断开连接。这是因为缺少心跳机制,WebSocket连接被认为是关闭的。为防止这种情况,应添加定时任务,每3秒发送一个pong帧来维持连接。

write tcp 127.0.0.1:8080->127.0.0.1:45748: write: broken pipe

在使用goframe写websocket时候出现 'write tcp 127.0.0.1:8080->127.0.0.1:45748: write: broken pipe',后面找大佬看过是因为,长时间没有给前端传递消息,导致前端断开连接,后端推送的时候端口已经断开。

为什么会出现这种呢?

WebSocket

WebSocket 是一种在客户端和服务器之间建立持久化连接的协议,它允许双方实时地交换数据。由于 WebSocket 连接是长时间保持的,因此需要一种机制来确保连接的稳定性和可靠性,这就是心跳机制。

心跳机制是指定期发送一些数据包来保持连接的活跃状态。在 WebSocket 连接中,心跳包通常是空消息或一些特定的标识符,发送方会定时向接收方发送心跳包,接收方收到心跳包后会立即回复一个确认消息。通过这种方式,可以检测连接是否还处于活跃状态。

结论

由于长时间没有给前端发送数据,所以出现了断开的情况,通俗一点:“来说就是他感受不到我的 心跳了,以为我嘎了,其实我还在等待数据,没有嘎”。

这时候加一个一个定时任务向前端发送pong帧保持心跳连接就可以了

	for {
		select {
		case b := <-message: //有数据通过websocket推送
			ws.WriteMessage() //写入数据

		case <-time.After(3 * time.Second):    //没数据,定时写入pong帧
			ws.WriteControl(9, nil, time.Now().Add(time.Second*1)) //定时写入pong帧
		}
	}

//里面参数没有写全

### 问题分析 用户的问题涉及在WSL子系统中运行的Docker容器内启动了一个Flask服务,但本机IP无法访问该服务,而`127.0.0.1`可以正常访问。以下是针对此问题的专业解答。 --- ### 端口映射含义 端口映射`127.0.0.1:5001->5000/tcp`表示宿主机上的`127.0.0.1:5001`端口被映射到Docker容器内的`5000`端口,并且协议为TCP。这意味着只有通过宿主机的`127.0.0.1`地址才能访问容器内的服务[^1]。如果需要通过宿主机的真实IP地址访问容器中的服务,则需要将端口映射更改为`0.0.0.0:5001->5000/tcp`。 --- ### 解决本机IP无法访问的问题 #### 1. 修改Docker端口映射 确保在运行Docker容器时使用以下命令,使宿主机的所有网络接口都可以访问容器中的服务: ```bash docker run -p 0.0.0.0:5001:5000 flask-app ``` 这样,宿主机的真实IP地址也可以访问容器中的Flask服务。 #### 2. 检查Flask服务监听地址 确认Flask服务监听的是`0.0.0.0`而非`127.0.0.1`。可以通过以下代码启动Flask服务: ```python app.run(host='0.0.0.0', port=5000) ``` #### 3. 获取WSL的IP地址 由于WSL运行在一个虚拟网络中,其IP地址不同于宿主机的真实IP地址。可以通过以下命令获取WSL的IP地址: ```bash ip addr show eth0 | grep 'inet ' ``` 假设输出为`192.168.3.9`,则可以通过该IP地址访问Flask服务。 #### 4. 配置Windows防火墙 如果仍然无法通过宿主机的真实IP地址访问Flask服务,可能是因为Windows防火墙阻止了相关端口的入站连接。可以通过以下步骤允许端口`5001`的入站连接: - 打开“控制面板” -> “系统和安全” -> “Windows Defender防火墙”。 - 点击“高级设置”,然后选择“入站规则” -> “新建规则”。 - 选择“端口”,指定端口号`5001`,并允许连接。 #### 5. 使用WSL桥接模式(替代方案) WSL2不支持直接桥接模式,但可以通过配置宿主机的端口转发来实现类似效果。例如,在Windows PowerShell中运行以下命令: ```powershell netsh interface portproxy add v4tov4 listenport=5001 listenaddress=0.0.0.0 connectport=5001 connectaddress=<WSL_IP> ``` 其中`<WSL_IP>`是WSL的IP地址。 --- ### 示例代码 以下是一个完整的示例,展示如何正确配置Flask服务和Docker容器以实现通过宿主机IP访问: #### Flask应用代码 ```python from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return "Hello, Docker!" if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) ``` #### 运行Docker容器 ```bash docker build -t flask-app . docker run -p 0.0.0.0:5001:5000 flask-app ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值