我是HullQin,公众号线下聚会游戏的作者(欢迎关注公众号,发送加微信,交个朋友),转发本文前需获得作者HullQin授权。我独立开发了《联机桌游合集》,是个网页,可以很方便的跟朋友联机玩斗地主、五子棋等游戏,不收费没广告。还开发了《Dice Crush》参加Game Jam 2022。喜欢可以关注我 HullQin 噢~我有空了会分享做游戏的相关技术。
背景
第一篇文章:《为什么我选用Go重构Python版本的WebSocket服务?》,介绍了我的目标。
上篇文章讲了《你的第一个Go WebSocket服务: echo server》,今天我们实现一个聊天室。
如果你没阅读上一篇文章,一定要先看一下,因为这篇文章更复杂,如果你不弄懂上一篇,这篇可能看不懂哦。
新建项目并安装依赖
可参考《你的第一个Go WebSocket服务: echo server》。
新建个项目文件夹,命令行执行以下,安装Go Websocket依赖:
go get github.com/gorilla/websocket
拷贝chat代码
把gorilla/websocket
的官方demo拷贝过来即可,我们慢慢分析:
你需要这4个文件:
- main.go
- hub.go
- client.go
- index.html
第一步,看主函数
func main() {
flag.Parse()
hub := newHub()
go hub.run()
http.HandleFunc("/", serveHome)
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
serveWs(hub, w, r)
})
err := http.ListenAndServe(*addr, nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
上篇已经介绍了flag
和http.HandleFunc
,这里跟上篇是一模一样的。
这里还开启了一个goroutine,注意它是写在main函数里的,不是写在http.HandleFunc里的。所以不管有多少客户端连接,这个服务只开启了一个goroutine。newHub().run()
。我们下一步看newHub()
,在hub.go文件中。
再看下注册的2个请求处理函数:
serveHome
是一个HTTP服务,把html文件返回给请求方(浏览器)。- 针对
/ws
路由,则会调用serveWs
,我们下下一步看serveWs
做了什么,在clent.go文件中。
第二步,看hub.go
Hub定义和newHub函数定义
type Hub struct {
clients map[*Client]bool
broadcast chan []byte
register chan *Client
unregister chan *Client
}
func newHub() *Hub {