我是公众号线下派对游戏的作者HullQin(欢迎关注公众号,发加微信,交个朋友),再转发这篇文章由作者HullQin授权。我独立开发了《联机桌游合集》,这是一个网页,在这里你可以轻松地和朋友一起玩网络游戏,五子棋等游戏,不收费,也没有广告。还为GameJam2022开发了《Dice Crush》,喜欢的话可以关注我HullQin哦~有空我会分享制作游戏的相关技术。背景第一篇:《为什么我选用Go重构Python版本的WebSocket服务?》,介绍我的目标。第二篇文章:《你的第一个Go WebSocket服务: echo server》,介绍了如何编写WebSocket服务端。第三篇:《单房间的聊天室》,介绍如何实现单间聊天室。今天我们实现一个多房间聊天室。如果你还没有读过上面的文章,你必须先阅读它,因为这篇文章比较复杂。如果以上文章看不懂,这篇文章可能跟不上节奏。以第三篇的代码为起点,今天,我们可以修改上次“聊天室”的代码。因为gorilla/websocket官方并没有提供多房间聊天室的demo,而只提供了单房间聊天室的demo(也就是上一篇文章说的),这次要自己开发了!还记得上次画的架构图吗?这一次,我们要手动修改代码!不直接写代码了,我们先画图吧!理清思绪,代码唾手可得!以前我们全球只有一个Hubgoroutine,广播(broadcast)就依赖这个goroutine。客户端将自己要广播的消息发送到广播通道,Hubgoroutine读取广播通道,遍历其客户端,将消息写入发送通道,然后每个客户端的Writegoroutine读取发送通道并发送信息。既然要实现多房间,那么就应该有多个Hubgoroutines。具体表现应该是这样的:什么时候创建房间在上一篇文章中,我们只有一个房间,所以服务启动的时候,在main函数中已经启动了Hubgoroutine,但是这次不行。我们可能有多个房间,所以有两种选择。方案一:设置固定的房间数如果房间数是固定的,比如你设置一共只有10个房间,那么你可以参考上一篇文章,但是这次你要调用gohub。运行()10次。因为每次调用都会启动一个goroutine,10个房间就是10次。方案二:动态创建房间如果房间允许动态创建,那么客户端连接时需要传入一个“房间号”参数,需要判断当前“房间号”是否存在。如果不存在,需要主动创建(调用gohub.run()),如果存在则使用已有的房间。结论如果是方案一,没有挑战性。参考上一篇文章即可轻松实现。今天我们就按照第二个方案来做。如何决定客户端连接到哪个房间由于我们有多个房间,客户端必须告诉服务器我想进入哪个房间。常见的方案有3种:方案1:在URL中指定我们可以在连接WebSocket时在URL中指定(通过路径或参数)。在上一篇文章中,我们为WebSocket服务定义的路径有一条规则是/ws。它可以扩展为/ws/[房间号]。只读【房间号】。方案二:在cookie中指定,在连接WebSocket时,将当前域名的cookie也带过来,服务器端可以读取。因此,房号信息也可以存储在cookie中。注意:“cookie指定”的方式很常见,尤其是网页上的【用户留言】。如果有人喜欢或关注你,这条消息需要实时推送给用户。如果您再打开几个Tab,应该会收到所有这些Tab。在这种情况下,您的每个浏览器选项卡都是一个“客户”,而您的帐户是一个“房间”。(房间此时是一个抽象的概念,不能算是真正的房间,只是一个连接池,广播消息时,这个池中的所有Client都会收到相同的消息)选项3:连接完成时,客户端主动发送消息,表示这个房间和方案1、2有本质区别,方案1、2是在连接WebSocket的时候确定房间号,效率更高。但是第三种选择是,当连接完成后,客户端发送消息通知服务器房间号。虽然效率不如方案一和方案二,但是更加灵活和可扩展。因为该消息可以附加更多信息。这也是很多应用采用的方案,大胆使用吧!因为对效率的影响可以忽略不计,但是对可扩展性的影响太大了,而且会影响你未来几年的维护成本!为什么不放标题信息呢?因为WebSocket协议其实并不推荐把信息放在自定义的header中。看一下建立WebSocket连接的JSAPI的语法:与Http请求APIfetch不同,WebSocket不允许用户传入header参数。如果要传递附加信息,官方有3种建议:URL、cookie、建立连接后发送消息。这篇文章已被列出。好吧。以上就是本文的内容。下一篇我们将进入【实践篇】,编写代码,实现多房间聊天室。最后,我是公众号线下派对游戏的作者HullQin(欢迎关注公众号,发送加微信,交友),转载本文需作者HullQin授权。我独立开发了《联机桌游合集》,这是一个网页,在这里你可以轻松地和朋友一起玩网络游戏,五子棋等游戏,不收费,也没有广告。还为GameJam2022开发了《Dice Crush》,喜欢的话可以关注我HullQin哦~有空我会分享制作游戏的相关技术。
