[Go WebSocket] 单房间的聊天室

我是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)
   }
}

上篇已经介绍了flaghttp.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 {
   
   
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hull Qin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值