oldbee0925 2023-03-23 21:50 采纳率: 91.4%
浏览 22
已结题

请教一个django websocket同步与异步、group分组与向特定用户发信息的问题。(语言-python)

我用django、websocket开发一个在线扑克游戏,遇到问题请教。
我的意图,也是扑克游戏的普通规则:
1、利用django自带的auth模块,建立有不同的3个用户;
2、3个用户不会同时进入牌室,等到最后(第3个用户登录并send准备好的指令)进入,后端发不同的牌给3个用户;
3、出牌时,所有用户都能看到。
这里涉及到几个概念:
1、关于群发与私发。对于发牌,是一对一向指定用户私发;对于出牌,则是群发。怎样实现群发与私发?
2、等待用户到齐,这个需要用异步模式吗?还是不一定?或者这个阶段用ajax请求?
脑袋一团雾水,请教各位的指点,最好有代码及注释说明!谢谢!

  • 写回答

2条回答 默认 最新

  • IT_service_mesh 2023-03-23 22:05
    关注

    参考GPT和自己的思路:

    对于你的问题,我建议使用django-socketio这个第三方库来实现websocket的功能。它可以支持异步、分组和向特定用户发送信息等功能。

    对于你的需求,可以先使用django自带auth模块建立3个用户,然后在websocket连接时将用户所属的组信息传入。可以使用socketio的join_group和leave_group方法进行分组操作。

    对于发牌,可以在服务器端维护一个牌局信息,然后根据用户所属的组向对应的用户发送发牌信息,例如:

    from socketio.namespace import BaseNamespace
    
    class PokerNamespace(BaseNamespace):
    
        def on_connect(self):
            # 将用户所属的组信息传入
            self.group = self.request.args.get('group')
    
        def on_ready(self, data):
            # 等待所有用户准备就绪
            ready_users = get_ready_users()
            if len(ready_users) == 3:
                # 发牌
                deal_cards()
                # 向各自分组的用户发送发牌信息
                self.socketio.emit('deal', cards, room=self.group)
    

    对于出牌,可以使用socketio的broadcast方法向所有用户群发出牌信息,例如:

    def on_play_card(self, data):
            # 出牌
            play_card(data['card'])
            # 群发出牌信息
            self.socketio.emit('play', {'player': self.request.sid, 'card': data['card']}, broadcast=True)
    

    至于等待用户到齐的问题,可以在客户端发送一个ready事件告知服务器用户已准备就绪,然后在服务器端维护一个列表,判断列表中的用户数是否为3,若为3则说明所有用户都准备就绪,可以进行发牌操作。可以使用socketio的emit方法向单个用户发送信息,例如:

    def on_ready(self, data):
            # 将准备就绪的用户添加到列表中
            self.ready_users.append(self.request.sid)
            # 发送准备就绪信息给用户
            self.socketio.emit('ready', {'player': self.request.sid})
            if len(self.ready_users) == 3:
                # 发牌
                deal_cards()
                # 向各自分组的用户发送发牌信息
                self.socketio.emit('deal', cards, room=self.group)
    

    以上是代码示例,注意注释和自己的代码逻辑进行对比。希望可以帮助到你!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月30日
  • 已采纳回答 3月30日
  • 创建了问题 3月23日

悬赏问题

  • ¥15 chaquopy python 安卓
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 CSS实现渐隐虚线框
  • ¥15 有没有帮写代码做实验仿真的
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题