Использование websocket для отправки сообщений между двумя пользователями, но отправляет только один пользователь
Высокий уровень
< <Я делаю это, подключая обоих пользователей к веб-сокету. После подключения каждый пользователь должен отправить сообщение другому пользователю вместе с идентификатором комнаты, в которую я буду перенаправлять пользователей.
Суть проблемы в том, что только пользователь, подключившийся к вебсокету последним, отправляет сообщение первому пользователю, а не наоборот
Желаемое действие
Это желаемое действие
- ПользовательА подключается к вебсокету
- ПользовательВ подключается к вебсокету
- UserA посылает обратно UserB, UserB's user_id, вместе с roomID
- UserB отправляет обратно UserA, UserA's user_id, вместе с roomID .
Это то, что происходит в настоящее время
- ПользовательА подключается к вебсокету
- ПользовательВ подключается к вебсокету
- UserB отправляет обратно UserA, UserA's user_id, вместе с roomID
Вот мой код фронтенда:
...
connect() {
const args = JSON.parse(localStorage.getItem('authTokens'))
const queryString = args.refresh
const path = `ws://127.0.0.1:8000/connect/testing/?${queryString}`;
this.socketRef = new WebSocket(path);
this.socketRef.onopen = (data) => {
console.log('WebSocket open');
}
this.socketRef.onerror = e => {
console.log(e);
};
}
async sendData(data){
if(this.socketRef.readyState !== WebSocket.OPEN) {
console.log('we are still waiting')
this.socketRef.onopen = () => this.socketRef.send(data);
const socketResp = await new Promise((resolve, reject) => {
this.socketRef.onmessage = e => {
resolve(JSON.parse(e.data))
}
})
}
};
}
и вот код бэкенда:
class PracticeConsumer(AsyncWebsocketConsumer):
async def websocket_connect(self, event):
username = self.scope['user']
username_id = str(await self.get_user(username))
group_name = username_id
#subscribe user to group
await self.channel_layer.group_add(
'{}'.format(group_name),
self.channel_name
)
await self.accept()
async def websocket_receive(self, event):
received = event["text"]
invite_data = received.split()
matched_user = invite_data[0]
room_id = invite_data[1]
username = invite_data[2]
user_id = str(await self.get_user(matched_user))
my_response = {
"message": {'matched_user': matched_user,
'username': username,
'user_id': user_id,
'room_id': room_id
}
}
sleep(1)
await self.channel_layer.group_send(
'{}'.format(user_id),
{
"type": "send.message",
"message": json.dumps(my_response),
"username": username
})
async def send_message(self, event):
message = event['message']
logger.info(f'sending message inside presenter{message}')
await self.send(text_data=json.dumps({
'type': 'send_message',
'text': message
}))