Golang websocket客户端已关闭连接
我和戈朗有联系。如果客户端打开了连接,数据库会将online列更改为1。这是我的代码,但我没有实现最后一件事。我的问题是,如果客户端关闭了连接,如何将数据库列更改为0。如何跟踪客户端,并捕获关闭的连接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
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。但是,我用一个并发检查客户端映射的函数解决了这个问题。请用种族检测器运行代码。如果您在这里构建示例,它将在并发负载下崩溃。