RTCDataChannel发送方法不发送数据

Mac*_*ski 3 javascript html5 webrtc rtcdatachannel

我对RTCDataChannel有一个奇怪的问题.

我正在研究WebRTC,我已经开始进行WebRTC音频/视频聊天了.现在我想使用RTCDataChannel为其添加文本聊天和文件共享.

我已经像这样创建了RTCDataChannel:

var dataChannelOptions = {
    reliable: true,
    maxRetransmitTime: "2000"
};

dataChannel = yourConnection.createDataChannel("testDataChannel", dataChannelOptions);

dataChannel.onerror = function (error) {
    console.log("dataChannel.OnError:", error);
};

dataChannel.onmessage = function (event) {
    console.log("dataChannel.OnMessage:", event);
};

dataChannel.onopen = function (event) {
    console.log("dataChannel.OnOpen", event);
    dataChannel.send("Hello World!");
};

dataChannel.onclose = function (event) {
    console.log("dataChannel.OnClose", event);
};
Run Code Online (Sandbox Code Playgroud)

我唯一接受的是从dataChannel.onopen的第一行登录.我没有从dataChannel.onmessage收到日志.

没有错误..

当我手动调用dataChannel.send时结果是一样的.

测试:
谷歌Chrome(50.0.2661.94)
Firefox(45.0.2)

任何人都可以帮忙吗?

mid*_*ido 12

这是人们常犯的错误,你在两个浏览器上创建数据通道,但不接受任何一个,你需要使用RTCPeerConnection的ondatachannel事件并设置监听器


Nik*_*ari 6

我面临着同样的问题。根据 RTCDataChannel 文档,您应该处理 Peer Connection 对象上的回调以接收数据通道上的数据。下面的代码可能会有所帮助:

第 1 步:定义回调处理程序:

  var handleDataChannelOpen = function (event) {
    console.log("dataChannel.OnOpen", event);
    dataChannel.send("Hello World!");
  };

  var handleDataChannelMessageReceived = function (event) {
    console.log("dataChannel.OnMessage:", event);
  };

  var handleDataChannelError = function (error) {
    console.log("dataChannel.OnError:", error);
  };

  var handleDataChannelClose = function (event) {
    console.log("dataChannel.OnClose", event);
  };

  var handleChannelCallback = function (event) {
     dataChannel = event.channel;
     dataChannel.onopen = handleDataChannelOpen;
     dataChannel.onmessage = handleDataChannelMessageReceived;
     dataChannel.onerror = handleDataChannelError;
     dataChannel.onclose = handleDataChannelClose;
  };
Run Code Online (Sandbox Code Playgroud)

第 2 步:创建 RTC 对等连接:

  var pc = new RTCPeerConnection();
  pc.ondatachannel = handleChannelCallback;
Run Code Online (Sandbox Code Playgroud)

第 3 步:创建数据通道:

  var dataChannel = pc.createDataChannel('dataChannelName', {});

  dataChannel.onopen = handleDataChannelOpen;
  dataChannel.onmessage = handleDataChannelMessageReceived;
  dataChannel.onerror = handleDataChannelError;
  dataChannel.onclose = handleDataChannelClose;
Run Code Online (Sandbox Code Playgroud)

在您的代码中,您只需要添加 ondatachannel 回调处理程序即可接收数据。