(Go)比较ws循环中的EverChanged变量

(Go)比较ws循环中的EverChanged变量,go,websocket,gorilla,Go,Websocket,Gorilla,处理一个接收消息并进行相应处理的循环,基本上是一个带有keep alives和身份验证的websocket回显器,我已经在keep alive部分停留了一段时间 概念很简单,当服务器启动时,我用一个ticker创建一个goroutine,并初始化一个uint64指针,每次ticker每2秒滴答一次,我用atomic.AddUint64clockTicks增加指针,1,然后对于每个websocket连接goroutine,我用compare和atomic.LoadUint64clockTicks检

处理一个接收消息并进行相应处理的循环,基本上是一个带有keep alives和身份验证的websocket回显器,我已经在keep alive部分停留了一段时间

概念很简单,当服务器启动时,我用一个ticker创建一个goroutine,并初始化一个uint64指针,每次ticker每2秒滴答一次,我用atomic.AddUint64clockTicks增加指针,1,然后对于每个websocket连接goroutine,我用compare和atomic.LoadUint64clockTicks检查变量every tick,我发了一条乒乓球信息

编辑:在收到消息之前,似乎有什么东西正在阻止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.LoadUint64clockTicks&所有if块仅在发送i消息时运行。在msg上,这不是我想要的,我希望代码段在每次迭代中都运行,并继续运行退出nao。。。每次时钟信号增加时触发

下面是重要的代码部分,我正在使用Go和Gorilla的Websockets库:

func Clock() {
clockTicks = new(uint64)
*clockTicks = 0
clock := time.NewTicker(authIntervals).C
for {
    <-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, false
for {
    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正在阻止它,而且他非常确定websocket read方法调用从网络获取数据。由于网络连接读取方法阻塞,WebCocket方法也会阻塞


要发送ping,请在写循环中使用ticker或运行单独的goroutine进行ping。

是否有一种方法可以在不阻塞的情况下接收消息?@Whiteclaws不阻塞的情况下从网络连接获取数据是不可能的。您可以编写一个读循环,将消息发送到某个频道,该频道上的接收器使用select来避免阻塞。请参见Gorilla聊天示例。