本文分享 WebRTC入门系列的第 5 部分内容,在这一部分中,我将介绍数据通道的基础知识。
什么是数据通道?数据通道代表一个网络通道,可用于双向的点对点数据传输。该 API 类似于 WebSocket,尽管如描述所述,你无需通过服务器即可相互发送消息。DataChannel 对于诸如文件共享之类的事情很有用。此外,WebSocket 也受 TCP 限制,而数据通道可以使用 TCP 和 UDP。
这就引出了下一个问题,你应该使用 TCP 还是 UDP ?使用 TCP,数据的传输是可靠和有序的,但如果发生丢包等情况,就会造成 “阻塞”。使用 UDP,数据的传输是不可靠或有序的,然而,如果数据包丢失发生,数据包将被发送。哪种方式最好,主要取决于你想创建什么类型的应用程序,如果是聊天应用程序,你最有可能使用 TCP,如果是游戏应用程序,你可能需要更多的 “实时 “数据传输,所以我推荐UDP。
另外,你可以创建的数据通道的数量限制也因浏览器而异,限制大约是65,534,尽管我认为你不需要这么多。
要创建一个数据通道,我们需要传递一些选项。最常用的选项是:
ordered:如果为真,数据包将以与发送时相同的顺序接收。
maxPacketLifetime:在不可靠模式下,尝试传输一个信息可能需要的最大毫秒数。
maxRetransmits:在不可靠模式下,用户代理应尝试重新传输第一次失败的消息的最大次数。
数据通道是通过 RTCPeerConnection 的 “createDataChannel “方法创建的,它将数据通道添加到RTCPeerConnection 中,并在远程对等的 RTCPeerConnection 上触发 “ondatachannel ” 事件。
好吧,现在无聊的事情已经解决了,让我们来实现吧!
我们将在之前的例子中加入发送和接收聊天信息的功能,所以首先我们需要编辑 public_index.html。打开它,在屏幕共享按钮下面添加以下内容:
<br />
<input type="text" id="chatMessage" placeholder="Enter message"/>
<button id="sendMessageButton" onclick="sendMessage();">Send</button>
这是 HTML 的有趣部分 ,打开 public/main.js。
首先,我们为数据通道创建变量。
let dataChannel;
接下来在“call”方法中,在“initializePeerConnection”之后添加以下内容:
initializeDataChannel();
接下来我们将创建该方法,在“initializePeerConnection”方法之后添加以下内容:
const initializeDataChannel = () => {
const config = { ordered: true };
dataChannel = peerConnection.createDataChannel('dataChannel', config);
initializeDataChannelListeners();
};
这里我们初始化数据通道的选项。我们正在创建一个简单的消息传输,所以我希望对数据包进行排序,否则对话可能会变得很奇怪。接下来我们初始化数据通道,“dataChannel”是该通道的标签,在这里我们传递配置选项。
完成后,“ondatachannel”事件应该在远程对等端触发,所以让我们实现它。在“initializePeerConnection”方法中,在“ontrack”事件之后添加以下监听器。
peerConnection.ondatachannel = ({ channel }) => {
console.log('peerConnection::ondatachannel');
dataChannel = channel;
initializeDataChannelListeners();
};
这里我们将全局数据通道设置为接收通道,然后初始化数据通道监听器。让我们在“initializeDataChannel”之后创建这个方法:
const initializeDataChannelListeners = () => {
dataChannel.onopen = () => console.log('dataChannel opened');
dataChannel.onclose = () => console.log('dataChannel closed');
dataChannel.onerror = (error) => console.error('dataChannel error:', error);
dataChannel.onmessage = ({ data }) => {
console.log('dataChannel data', data);
};
};
在这里我们监听数据通道事件,你可以看到它与 WebSocket API 非常相似。当我们收到一条消息时,我们只是将其记录到控制台。
接下来,我们需要一种方法来发送用户不遗余力为我们写的消息。在文件的末尾添加以下内容:
const sendMessage = () => {
const message = document.getElementById('chatMessage').value;
if (!message) {
alert('no message entered');
return;
}
if (!dataChannel || dataChannel.readyState !== 'open') {
alert('data channel is undefined or is not connected');
return;
}
console.log('sending message', message);
const data = {
message,
time: new Date()
};
dataChannel.send(JSON.stringify(data));
document.getElementById('chatMessage').value = '';
};
在这里,我们得到文本输入的值,并检查它是否为空,如果是空的,我们就提醒用户。之后,我们检查 dataChannel 是否已经被设置,状态是否为 “打开”,就像 WebSocket 一样,如果没有打开/连接,就不能发送任何东西。最后,我们添加一个时间戳,并将其发送给远程对等方,这应该会触发其数据通道的 “onmessage “事件。
最后我们需要在会话结束时关闭数据通道,在“stop”方法中添加上面的 peerConnection.close():
dataChannel.close();
好的,都完成了,现在让我们来试试吧! 首先,我们启动服务器。
npm start
与前面的示例一样,在“https://localhost:3000”打开两个窗口/选项卡并开始通话。呼叫开始后尝试输入消息并单击发送,该消息应显示在远程对等方的控制台中,如下所示:
这就是数据通道的基础知识,我希望这对你有用。接下来在第6部分,我们将从Android开始讨论原生的一些东西。
希望在那里见到你!
Github 地址:https://github.com/ethand91/webrtc-tutorial
作者:Ethan Denvir
系列阅读:
使用 JavaScript 和 Nodejs 搭建 webrtc信令服务器(webrtc入门一)
WebRTC MediaDevices API 获取媒体设备的访问权限(webrtc入门二)
WebRTC建立P2P连接和发送/接收媒体(webrtc入门三)
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/webrtc/22565.html