Golang websocket客户端已关闭连接

Golang websocket客户端已关闭连接,go,websocket,connection,Go,Websocket,Connection,我和戈朗有联系。如果客户端打开了连接,数据库会将online列更改为1。这是我的代码,但我没有实现最后一件事。我的问题是,如果客户端关闭了连接,如何将数据库列更改为0。如何跟踪客户端,并捕获关闭的连接 package main import ( "golang.org/x/net/websocket" "fmt" "log" "net/http" "strconv" ) type Clients struct { webs *websocke

我和戈朗有联系。如果客户端打开了连接,数据库会将online列更改为1。这是我的代码,但我没有实现最后一件事。我的问题是,如果客户端关闭了连接,如何将数据库列更改为0。如何跟踪客户端,并捕获关闭的连接

package main

import (
    "golang.org/x/net/websocket"
    "fmt"
    "log"
    "net/http"

    "strconv"
)

type Clients struct {
    webs *websocket.Conn
    clientAddr string
    id int
}

var (
    ActiveClients = make(map[Clients]int)
)

func Echo(ws *websocket.Conn){
    var err error

    client := ws.Request().RemoteAddr
    sockCli := Clients{webs: ws, clientAddr: client, id: 0}
    ActiveClients[sockCli] = 1


    for{
        var reply string

        if err = websocket.Message.Receive(ws, &reply); err != nil{
            fmt.Println("Cant receive", err)
            break
        }else{
            if sockCli.id == 0{
                sockCli.id, err = strconv.Atoi(reply)

            }
        }


        if err = websocket.Message.Send(ws, "id:"+strconv.Itoa(sockCli.id)); err != nil{
            fmt.Println("Cant send")
        }



        for cs, _ := range ActiveClients {
            if cs.id == 1{
                if err = websocket.Message.Send(cs.webs, "asd"); err != nil {
                    // we could not send the message to a peer
                    log.Println("Could not send message to ", cs.clientAddr, err.Error())
                }
            }else {
                fmt.Println("No")
            }



        }


    }

}

func main(){
    http.Handle("/", websocket.Handler(Echo))

    if err := http.ListenAndServe(":1234", nil); err != nil{
        log.Fatal("ListenAndServe: ", err)
    }
}

从多个goroutine访问
ActiveClients
是一场数据竞赛——您至少需要使用互斥锁来保护它。当发生读或写错误时,您知道连接何时关闭。您试图更改哪个“数据库”列?联机列从1更改为0。但是,我用一个并发检查客户端映射的函数解决了这个问题。请用种族检测器运行代码。如果您在这里构建示例,它将在并发负载下崩溃。从多个goroutine访问
ActiveClients
是一场数据竞争——您至少需要使用互斥锁来保护它。当发生读或写错误时,您知道连接何时关闭。您试图更改哪个“数据库”列?联机列从1更改为0。但是,我用一个并发检查客户端映射的函数解决了这个问题。请用种族检测器运行代码。如果您在这里构建示例,它将在并发负载下崩溃。