为了账号安全,请及时绑定邮箱和手机立即绑定

(Go) 比较 ws 循环中不断变化的变量

(Go) 比较 ws 循环中不断变化的变量

Go
犯罪嫌疑人X 2021-11-22 10:29:44
在接收消息并相应地处理它们的循环上工作,基本上是一个带有保活和身份验证的 websocket echo-er,我现在已经被困在保活部分了一段时间。概念很简单,当服务器启动时,我创建了一个带有自动收报机的 goroutine,并初始化了一个 uint64 指针,每次该自动收报机滴答声(每 2 秒),我用 atomic.AddUint64(clockTicks, 1) 增加指针,然后对于每个 websocket 连接 goroutine,我使用比较和 atomic.LoadUint64(clockTicks) 检查每个刻度的变量,然后发送 ping/pong 消息。编辑:似乎有什么东西阻塞了 for 循环,直到收到一条消息,结果:i := atomic.LoadUint64(clockTicks)    if i != cur {        cur = i        if act != true {            fmt.Println("Quit Nao U filthy bot.")            return        } else {            fmt.Println("Keep Going.")            act = false        }    }在此代码段中, i := atomic.LoadUint64(clockTicks) & 所有 if 块仅在发送 i 消息时运行(在 msg 上打印“继续前进。”),这不是我想要的,我希望该代码段每次运行用于迭代和“继续前进”。& "Quit nao ..." 触发每次clockTicks增加这是重要的代码部分,我使用的是 Go 和 Gorilla 的 Websockets 库:func Clock() {clockTicks = new(uint64)*clockTicks = 0clock := time.NewTicker(authIntervals).Cfor {    <-clock    atomic.AddUint64(clockTicks, 1)}}var wsu = websocket.Upgrader{ReadBufferSize:  1024,WriteBufferSize: 1024,CheckOrigin:     OriginHandler,}func serveWS(w http.ResponseWriter, r *http.Request) {if r.Method != "GET" {    http.Error(w, "Method not allowed", 405)    return}ws, err := wsu.Upgrade(w, r, nil)if err != nil {    fmt.Println(err)    return}defer ws.Close()cur := atomic.LoadUint64(clockTicks)var act, val = true, falsefor {    i := atomic.LoadUint64(clockTicks)    if i != cur { /* Only triggers when I receive a msg */        cur = i        if act != true {            fmt.Println("Quit Nao U filthy bot.")            return        } else {            fmt.Println("Keep Going.")            act = false        }    }    mtype, p, err := ws.ReadMessage()    if err != nil {        return    }    ...}编辑 2:IRC 中有人建议 ws.ReadMessage 可能正在阻塞,但我不太确定(他说 ws.ReadMessage 实现中使用的 ioutil.ReadAll 正在阻塞它,他对此非常确定)
查看完整描述

1 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

websocket 读取方法调用网络连接读取方法从网络获取数据。因为网络连接 Read 方法阻塞,所以 webscocket 方法也会阻塞。

要发送 ping,请像 Gorilla 聊天示例中那样在写入循环中使用自动收报机,或者像 Gorilla 命令示例中那样为 ping 运行单独的 goroutine 。


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信