我正在尝试使用websockets作为学习项目在Golang中构建实时多人游戏服务器,但我难以理解应该如何确切地实现这个概念:
给游戏室中的所有用户一个持续时间MAX_TIMEOUT
来响应提供的提示。响应是通过websocket连接提交的。如果所有用户在MAX_TIMEOUT
之前做出响应,则Action A
应该使用响应来进行。如果MAX_TIMEOUT
在提交所有提示之前已经过去,那么Action B
应该会发生,并使用可用的响应。
来自Node.JS,我可以看到自己使用Promises实现了这一点,但是在Golang中,我很迷路。
有什么建议吗?
答案 0 :(得分:2)
结帐gorilla/websocket's chat example。如上所述,它使用client.go
中的代码和通道。
服务器的提示处理可以是它自己的与读/写泵例程并行运行的例程。
go func() {
for {
for _, player := range players {
player.Answered = false
player.Send("prompt")
}
time.Sleep(time.Second * 10)
for _, player := range players {
if player.Answered {
player.Send("You answered")
} else {
player.Send("Too slow")
}
}
}
}()
// the reading routine sets `Answered` true when message received
答案 1 :(得分:2)
此示例应使您更好地了解如何实现超时。您需要使用select
语句来等待频道。第一个用值响应的通道就是被执行的情况。
package main
import (
"fmt"
"time"
)
func main() {
maxTimeout := 2 * time.Second
ready := make(chan bool, 1)
go collectUserResponses(ready)
select {
case <-ready:
fmt.Println("do action A")
case <-time.After(maxTimeout):
fmt.Println("do action B")
}
}
func collectUserResponses(ready chan bool) {
time.Sleep(1 * time.Second) // simulate waiting for users to respond
ready <- true
}