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, чтобы иметь низкую задержку между двумя отправками.