Соединение WebRTC P2P не может быть установлено даже при настроенном сервере STUN.Python

Программы на Python
Anonymous
 Соединение WebRTC P2P не может быть установлено даже при настроенном сервере STUN.

Сообщение Anonymous »

Я создаю простое приложение для однорангового чата, используя JavaScript (WebRTC + WebSocket) на стороне клиента и сервер сигнализации Python WebSocket (с использованием веб-сокетов) для сигнализации.
Сигнализация работает нормально — оба узла могут обмениваться предложениями, ответами и кандидатами ICE — но само соединение WebRTC всегда терпит неудачу (

Код: Выделить всё

connectionState
становится «неудачным»).
Я пытался добавить общедоступный STUN-сервер Google, но он все равно не подключается.

🧩 Клиентская часть (JavaScript)

Код: Выделить всё

const wsUrl = "ws://localhost:8555";
const config = { iceServers: [{ urls: "stun:stun.l.google.com:19302" }] };
let ws, pc, dc, pendingCandidates = [];

async function createPC(isInitiator = false, targetKey = null) {
pc = new RTCPeerConnection(config);

pc.onicecandidate = e => {
if (e.candidate) {
ws.send(JSON.stringify({ action: "ice", data: e.candidate, target: targetKey }));
}
};

pc.onconnectionstatechange = () => console.log("Connection state:", pc.connectionState);

if (isInitiator) {
dc = pc.createDataChannel("chat");
dc.onopen = () => console.log("Data channel open");
}
}

async function startCall(targetKey) {
await createPC(true, targetKey);
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
ws.send(JSON.stringify({ action: "offer", data: offer, target: targetKey }));
}

async function handleOffer(msg) {
await createPC(false, msg.from);
await pc.setRemoteDescription(msg.data);
const answer = await pc.createAnswer();
await pc.setLocalDescription(answer);
ws.send(JSON.stringify({ action: "answer", data: answer, target: msg.from }));
}
🖥️ Сервер сигнализации (Python)

Код: Выделить всё

elif act == "offer":
target = USERS_BY_KEY.get(data["target"])
if target and target["ws"]:
await target["ws"].send(json.dumps(data))

elif act == "answer":
target = USERS_BY_KEY.get(data["target"])
if target and target["ws"]:
await target["ws"].send(json.dumps(data))

elif act == "ice":
target = USERS_BY_KEY.get(data["target"])
if target and target["ws"]:
await target["ws"].send(json.dumps(data))
🧠 Что происходит
  • Оба клиента подключаются к серверу сигнализации WebSocket.
  • Обмен предложениями и ответами происходит успешно.
  • Кандидаты ICE отправляются и принимаются.
  • Однако, pc.connectionState становится «сбойным», и DataChannel никогда не открывается.
🔍 Что я пробовал
  • Добавлен сервер Google STUN (

    Код: Выделить всё

    stun:stun.l.google.com:19302
    )
  • Убедились, что оба узла находятся в одной сети.
  • Проверено, что обмен предложениями, ответами и кандидатами ICE осуществляется правильно.
  • Проверено как в Chrome, так и в Firefox.
❓ Вопрос
Что может привести к сбою соединения WebRTC (

Код: Выделить всё

connectionState: "failed"
), даже если обмен сигналами и кандидаты ICE кажутся правильными?
Что-то отсутствует или неправильно настроено в моей сигнализации или обработке ICE?


Подробнее здесь: https://stackoverflow.com/questions/798 ... configured

Вернуться в «Python»