Django Channels не может "socket.send" при попытке постоянной отправки данных клиенту с сервера

Я пытаюсь создать игру на django с использованием каналов. Для этого мне нужно, чтобы сервер отправлял данные клиенту через определенное время. Мне удалось добиться этого, но теперь я не могу сокет.отправить что-либо обратно на сервер. Я с трудом пытаюсь понять, почему так происходит.

Я пытаюсь добиться того, чтобы сервер постоянно отправлял данные и получал данные от клиента для сохранения их в базе данных. Вторая часть - это то, на чем я застрял в настоящее время.

Edit: Забыл упомянуть, я запустил код без цикла while и тогда socket.send работает как ожидалось.

consumers.py

from channels.generic.websocket import AsyncWebsocketConsumer
from asgiref.sync import sync_to_async
from channels.db import database_sync_to_async

from django.utils.crypto import get_random_string

from .models import Model

import asyncio
import json
import random
from hashlib import pbkdf2_hmac

@database_sync_to_async
def get_round():
    a = Model.objects.last()
    return a.round_number


class Game(AsyncWebsocketConsumer):

    async def connect(self):
        self.connected = True
        self.room_name = 'gameName'
        self.room_group_name = 'game_room'

        await self.channel_layer.group_add(
            self.room_group_name,
            self.room_name
        )

        await self.accept()

        while self.connected:
            await asyncio.sleep(5)

            server_seed = get_random_string(length=64)
            public_seed = random.randint(0, 999999)
            round = await get_round()

            hash = pbkdf2_hmac('sha256', bytes(server_seed, 'utf-8'), bytes(public_seed), round)

            result = int(hash[0:8].hex(), 16) % 15

            await self.send(text_data = json.dumps({
                'round_result': result
            }))

       

    async def disconnect(self):
        await self.channel_layer.group_discard(
            self.room_group_name,
            self.channel_name
        )
        self.connected = False

    async def receive(self, text_data):
        data = json.loads(text_data)
        print(data)

        # nothing is happening here

        # await self.send(text_data = json.dumps({
        #         'data': data
        # }))
home.html


<script>
    let socket = new WebSocket('ws://localhost:8000/ws/game/game_name/')

    socket.onopen = function (e) {
        console.log('Socket connected')
    }

    socket.onmessage = function (e) {
        console.log(e)

        const data = JSON.parse(e.data)

        if(data.round_result) {
            document.querySelector('#result').innerHTML = data.round_result
        }
    }

    socket.onclose = function (e) {
        console.log('Socket closed')
    }

    document.querySelector('#bet-submit').onclick = function(e) {
        const id = 12312313123123123
        const value = document.getElementById('value').value

        socket.send(JSON.stringify({
            'id': id,
            'value': value
        }))
    }
</script>

У меня была такая же проблема, и я решил ее добавлением

await asyncio.sleep(time)

после

await self.send()

В моем случае я использую функцию send для отправки кадров видео, поэтому я установил time = 0.00000001, чтобы иметь низкую задержку между двумя отправками.

Вернуться на верх