【问题标题】:How to limit number of clients in django channels' room如何限制 django 频道房间中的客户端数量
【发布时间】:2021-11-01 14:36:03
【问题描述】:

我希望将房间中的用户数量限制为 2,因为我正在制作插座游戏 如果两个玩家可以玩井字游戏或四连线游戏,所以我试图找到一些方法来限制一个房间里只有 2 个玩家。

下面是我的 comsumers.py

from channels.generic.websocket import WebsocketConsumer
from asgiref.sync import async_to_sync
import json


class GameRoom(WebsocketConsumer):

    def connect(self):
        self.room_name = self.scope['url_route']['kwargs']['room_code']
        self.room_group_name = 'room_%s' % self.room_name
        print(self.room_group_name)
        async_to_sync(self.channel_layer.group_add)(
            self.room_group_name,
            self.channel_name
        )

        self.accept()

我已经从这个问题中删除了一些不太必要的方法

【问题讨论】:

  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: django django-rest-framework websocket django-views django-channels


【解决方案1】:

您必须在您的项目中创建一个room 模型并将连接的用户保存到其中,然后您可以在您的connect 方法中添加一个validation,如下所示:

def connect(self):
    self.room_name = self.scope['url_route']['kwargs']['room_code']
    
    self.room = Room.objects.get(code=self.room_name)
    if self.room.connected_user >= 2:
        return self.close()
    else:
        self.room.connected_user = self.room.connected_user + 1
        self.room.save(update_fields=['connected_user'])

        self.room_group_name = 'room_%s' % self.room_name
        print(self.room_group_name)
        async_to_sync(self.channel_layer.group_add)(
            self.room_group_name,
            self.channel_name
        )

        self.accept()


def disconnect(self):
    ...
    self.room.connected_user = self.room.connected_user - 1 
    self.room.save(update_fields=['connected_user'])
  • 额外:

    当然,您可以使用F() 功能,并在connectdisconnect 中提高您的性能(当许多用户尝试同时连接时很有用)

【讨论】:

    猜你喜欢
    • 2015-10-06
    • 2014-08-11
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2015-01-05
    • 2018-09-25
    • 1970-01-01
    相关资源
    最近更新 更多