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

Форум по Javascript
Ответить
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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