Код: Выделить всё
socket_client.html
WebSocket demo
body {
font-family: "Courier New", sans-serif;
text-align: center;
}
.buttons {
font-size: 4em;
display: flex;
justify-content: center;
}
.button, .value {
line-height: 1;
padding: 2rem;
margin: 2rem;
border: medium solid;
min-height: 1em;
min-width: 1em;
}
.button {
cursor: pointer;
user-select: none;
}
.minus {
color: red;
}
.plus {
color: green;
}
.value {
min-width: 2em;
}
.state {
font-size: 2em;
}
-
?
+
? online
var minus = document.querySelector('.minus'),
plus = document.querySelector('.plus'),
value = document.querySelector('.value'),
users = document.querySelector('.users'),
websocket = new WebSocket("wss://localhost:8000/");
minus.onclick = function (event) {
websocket.send(JSON.stringify({action: 'minus'}));
}
plus.onclick = function (event) {
websocket.send(JSON.stringify({action: 'plus'}));
}
websocket.onmessage = function (event) {
data = JSON.parse(event.data);
switch (data.type) {
case 'state':
value.textContent = data.value;
break;
case 'users':
users.textContent = (
data.count.toString() + " user" +
(data.count == 1 ? "" : "s"));
break;
default:
console.error(
"unsupported event", data);
}
};
Код: Выделить всё
server.py
# WS server example that synchronizes state across clients
import asyncio
import json
import logging
import websockets
import ssl
logging.basicConfig()
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
# Generate with Lets Encrypt, chown to current user and 400 permissions
ssl_cert = "cert.pem"
ssl_key = "key.pem"
ssl_context.load_cert_chain(ssl_cert, keyfile=ssl_key)
STATE = {"value": 0}
USERS = set()
def state_event():
return json.dumps({"type": "state", **STATE})
def users_event():
return json.dumps({"type": "users", "count": len(USERS)})
async def notify_state():
if USERS: # asyncio.wait doesn't accept an empty list
message = state_event()
await asyncio.wait([user.send(message) for user in USERS])
async def notify_users():
if USERS: # asyncio.wait doesn't accept an empty list
message = users_event()
await asyncio.wait([user.send(message) for user in USERS])
async def register(websocket):
USERS.add(websocket)
await notify_users()
async def unregister(websocket):
USERS.remove(websocket)
await notify_users()
async def counter(websocket, path):
# register(websocket) sends user_event() to websocket
await register(websocket)
try:
await websocket.send(state_event())
async for message in websocket:
data = json.loads(message)
if data["action"] == "minus":
STATE["value"] -= 1
await notify_state()
elif data["action"] == "plus":
STATE["value"] += 1
await notify_state()
else:
logging.error("unsupported event: {}", data)
finally:
await unregister(websocket)
start_server = websockets.serve(counter, "0.0.0.0", 8000, ssl=ssl_context)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
Firefox не может установить соединение с сервером по адресу wss://localhost:8000/.
У меня есть клиентский HTML-файл с именем socket_client.html, который содержит код JavaScript для установления соединения WebSocket. Серверный код реализован на Python с использованием библиотеки websockets. Сервер настроен на использование шифрования SSL/TLS с самозаверяющим сертификатом.
Когда я открываю файл socket_client.html в Firefox, ему не удается установить соединение с сервером WebSocket по адресу wss://localhost:8000/. В сообщении об ошибке, предоставленном Firefox, говорится: «Firefox не может установить соединение с сервером по адресу wss://localhost:8000/».
Ожидаемое поведение:
Я ожидаю, что клиент WebSocket успешно установит соединение с сервером WebSocket, работающим на локальном хосте по порту 8000, и сможет отправлять и получать сообщения.
Дополнительная информация:
- Файл socket_client.html содержит код JavaScript для обработки нажатий кнопок и отправки сообщений WebSocket в зависимости от нажатой кнопки.
- Скрипт server.py настраивает сервер WebSocket с использованием веб-сокетов и реализует функции синхронизации состояния между клиентами.
- Сервер использует шифрование SSL/TLS с самоподписанным сертификатом (и key.pem), созданные с помощью Let's Encrypt. Разрешения для файлов сертификатов установлены правильно.
Код: Выделить всё
cert.pem - Я подтвердил, что серверный сценарий работает и прослушивает 0.0.0.0:8000, как и предполагалось.
Что может быть причиной этой ошибки в Firefox и как ее устранить? Есть ли какая-либо конкретная конфигурация или параметр, который необходимо настроить в Firefox для установки соединения WebSocket с сервером с использованием самозаверяющего сертификата?
Мобильная версия