Я кодирую простую комнату чата, используя WebSocket, Javascript (клиент) и Python (сервер). Я прочитал несколько учебников и документации, и вот мои два вопроса.Это обычное использование WebSocket или низкоуровневого?
1) На стороне JS, это нормально, что я должен делать такие вещи, как:
ws.send(JSON.stringify({ "type" : "message", "message" : "Hello" }));
ws.send(JSON.stringify({ "type" : "username_change", "newusername" : "John" }));
?
Нет ли что-то «менее низкоуровневое», например, ws.emit('message', 'hello')
или ws.emit('username_change', 'John')
?
2) На стороне сервера (с помощью рамки Python + Bottle) это стандарт, чтобы иметь:
users = set()
@get('/websocket', apply=[websocket])
def chat(ws):
users.add(ws)
while True:
msg = ws.receive()
for u in users:
u.send(msg)
users.remove(ws)
Я нахожу это довольно низкий уровень еще раз, чтобы сохранить список пользователей себя как а также факт отправки сообщений один за другим всем пользователям с циклом for
. Я думал, что есть функция .broadcast()
, которая позволяет автоматически отправлять сообщения всем подключенным пользователям.
Я пропустил что-то в ландшафте Websocket?
Интерфейс более высокого уровня, о котором вы спрашиваете, будет socket.io, который является слоем поверх webSocket. – jfriend00
Хорошо спасибо @ jfriend00. Содержит ли socket.io все подключенные пользователи при использовании трансляции? или он использует лучший/более эффективный метод? – Basj
Это петли. Не существует более эффективного метода для трансляции соединений webSocket. Каждое соединение webSocket представляет собой собственный сокет TCP. Вы должны отправлять отдельно каждому. Именно так работает TCP. – jfriend00