Я пытаюсь следовать этому примеру для создания DataChannel.
Для сигнализации я использую веб-сокеты, которые ведут себя так:
User A joins
User B joins
User B asks User A to create an offer
-> A opens datachannel before creating an offer
-> A sets his local description
User A sends his offer to User B
-> B answers the offer
-> B sets local and remote description
User B sends A his local description
( Пользователь B напрямую не отправляет сообщение пользователю A, это делается через веб-сокеты с промежуточным сервером, который проводит сеансы веб-сокетов, пропуская эту часть ради простоты)
Создание кода предложения для пользователя A является следующее:
let pc = new RTCPeerConnection({
iceServers: [
{
urls: "stun:stun.l.google.com:19302",
}
]
});
let dc = pc.createDataChannel("Base");
dc.onbufferedamountlow = function(){
console.error("dataChannel.onbufferedamountlow");
};
dc.onclose = function(){
console.error("dataChannel.onclose");
};
dc.onerror = function(){
console.error("dataChannel.onerror");
};
dc.onmessage = function(){
console.error("dataChannel.onmessage");
};
dc.onopen = function(){
console.error("dataChannel.onopen");
};
let offer = await pc.createOffer();
await pc.setLocalDescription(offer);
let offerString = JSON.stringify(pc.localDescription); //Is sent to B
Полный код для пользователя B следующий:
let pc = new RTCPeerConnection({
iceServers: [
{
urls: "stun:stun.l.google.com:19302",
}
]
});
await pc.setRemoteDescription(new RTCSessionDescription(offer)); //From A
let answer = await pc.createAnswer();
await pc.setLocalDescription(answer);
let answerString = JSON.stringify(pc.localDescription); //Returns to A
Поэтому, когда A получает ответ B, он просто:
await pc.setRemoteDescription(new RTCSessionDescription(answer));
Object A:
Объект B:
Firefox о: webrt c ошибки
То, что я также пытался без успеха:
- открытие канал данных после того, как оба пользователя установили соединения, ничего, ни одно из событий не запускается, некоторые обновления об этом:
- после создания канала данных на b Во-вторых, я всегда вижу, что ReadyState соединяется ... на обоих клиентах ...
- открывает канал данных на B, пока A все еще ожидает ответ B назад , Событие onclose канала данных запускается, даже не вызывая событие открытия ...
- используя https://test.webrtc.org/ для проверки, это результат:
-Я также искал другие вопросы или похожие на мои, форумы, блоги и т. Д. c ... все ответы, которые варьируются от 2 до 5 лет, кажутся устаревшими и не работает ...
-создание канала с обеих сторон примерно так:
pc.createDataChannel("Test", {
id: 1,
negotiated: true,
})
Приводит к OperationError: Id is in use
на одном из клиентов. Как я могу присоединиться к каналу по его идентификатору , если DO C заявляет это :
В качестве альтернативы (true) они могут быть согласованы вне диапазона, где обе стороны вызовите createDataChannel с согласованным идентификатором.
Если я должен присоединиться к каналу по идентификатору, но при создании объекта я получаю, что идентификатор используется, как мне присоединиться к нему?
Если я не укажу идентификатор, который я получаю TypeError: id is required when negotiated is true
В то время как do c говорит:
ID: Необязательно - 16-битная цифра c ID для канала; допустимые значения 0-65534. Если вы не включите эту опцию, пользовательский агент выберет для вас идентификатор.
Добавление await pc.addIceCandidate();
или await pc.addIceCandidate(null);
после настройки обоих подключений Локальное и Удаленное описание.
Запустил мой собственный сервер TURN с открытыми TCP и UDP, тот же результат, что и на сервере STUN Google.
Пробовал с использованием серверов STUN и TURN на iceServer
.
Пробовал как Firefox, так и Chrome последние версии.
Вопросы:
1) Когда должен открываться канал данных? После того, как оба клиента провели переговоры и p c .connectionState стабильно? Сразу после создания объекта подключения? До или после установки локального описания?