如何启动基本的WebRTC数据通道?

2023-12-21

如何启动基本的WebRTC数据通道?

这是我到目前为止所拥有的,但它似乎甚至没有尝试连接。我确信我只是缺少一些基本的东西。

var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection || window.msRTCPeerConnection;

var peerConnection = new RTCPeerConnection({
    iceServers: [
        {url: 'stun:stun1.l.google.com:19302'},
        {url: 'stun:stun2.l.google.com:19302'},
        {url: 'stun:stun3.l.google.com:19302'},
        {url: 'stun:stun4.l.google.com:19302'},
    ]
});
peerConnection.ondatachannel  = function () {
    console.log('peerConnection.ondatachannel');
};
peerConnection.onicecandidate = function () {
    console.log('peerConnection.onicecandidate');
};

var dataChannel = peerConnection.createDataChannel('myLabel', {
});

dataChannel.onerror = function (error) {
    console.log('dataChannel.onerror');
};

dataChannel.onmessage = function (event) {
    console.log('dataChannel.onmessage');
};

dataChannel.onopen = function () {
    console.log('dataChannel.onopen');
    dataChannel.send('Hello World!');
};

dataChannel.onclose = function () {
    console.log('dataChannel.onclose');
};
console.log(peerConnection, dataChannel);

WebRTC 假设您有一种方式向您想要联系的任何人发出信号(向其发送报价字符串并从中接收应答字符串)。如果没有服务器,你将如何做到这一点?

为了说明这一点,这里有一些代码可以完成除此之外的所有操作(适用于 Firefox 和 Chrome 45):

var config = { iceServers: [{ urls: "stun:stun.l.google.com:19302" }]};
var dc, pc = new RTCPeerConnection(config);
pc.ondatachannel = e => {
  dc = e.channel;
  dc.onopen = e => (log("Chat!"), chat.select());
  dc.onmessage = e => log(e.data);
}

function createOffer() {
  button.disabled = true;
  pc.ondatachannel({ channel: pc.createDataChannel("chat") });
  pc.createOffer().then(d => pc.setLocalDescription(d)).catch(failed);
  pc.onicecandidate = e => {
    if (e.candidate) return;
    offer.value = pc.localDescription.sdp;
    offer.select();
    answer.placeholder = "Paste answer here";
  };
};

offer.onkeypress = e => {
  if (e.keyCode != 13 || pc.signalingState != "stable") return;
  button.disabled = offer.disabled = true;
  var obj = { type:"offer", sdp:offer.value };
  pc.setRemoteDescription(new RTCSessionDescription(obj))
  .then(() => pc.createAnswer()).then(d => pc.setLocalDescription(d))
  .catch(failed);
  pc.onicecandidate = e => {
    if (e.candidate) return;
    answer.focus();
    answer.value = pc.localDescription.sdp;
    answer.select();
  };
};

answer.onkeypress = e => {
  if (e.keyCode != 13 || pc.signalingState != "have-local-offer") return;
  answer.disabled = true;
  var obj = { type:"answer", sdp:answer.value };
  pc.setRemoteDescription(new RTCSessionDescription(obj)).catch(failed);
};

chat.onkeypress = e => {
  if (e.keyCode != 13) return;
  dc.send(chat.value);
  log(chat.value);
  chat.value = "";
};

var log = msg => div.innerHTML += "<p>" + msg + "</p>";
var failed = e => log(e + ", line " + e.lineNumber);
<script src="https://rawgit.com/webrtc/adapter/master/adapter.js"></script>
<button id="button" onclick="createOffer()">Offer:</button>
<textarea id="offer" placeholder="Paste offer here"></textarea><br>
Answer: <textarea id="answer"></textarea><br><div id="div"></div>
Chat: <input id="chat"></input><br>

在第二个选项卡中打开此页面,您可以从一个选项卡与另一个选项卡(或与世界各地的另一台计算机)聊天。糟糕的是你必须自己去那里拿到offer:

  • Offer按钮(仅限选项卡 A)并等待 1-20 秒,直到您看到优惠文本,
  • 将报价文本从选项卡 A 复制粘贴到选项卡 B,然后点击Enter
  • 将选项卡 B 中出现的答案文本复制粘贴到选项卡 A,然后点击Enter.

您现在应该能够在选项卡之间聊天,而无需服务器。

正如你所看到的,这是一种低于标准的体验,这就是为什么你需要一些基本的 websocket 服务器来在 A 和 B 之间传递报价/答案(以及滴流冰候选人,如果你想快速连接),以获得东西开始了。一旦建立连接,您就可以使用数据通道来实现此目的,但需要做一些额外的工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何启动基本的WebRTC数据通道? 的相关文章

随机推荐

  • 为什么我的 DbContext DbSet 为空?

    我创建了一个新的实体框架 Code First 应用程序 并且 DbSet People 返回 null public class Person public int Id get set public string Name get se
  • 涂抹错误:下载时出错

    我不确定这是否是讨论 git lfs 的正确论坛 但由于我们有一个标签 我将发布我的问题 我已阅读 Bitbucket 中的 Git LFS 故障排除 页面 https confluence atlassian com bitbucket
  • Rails 3.1 Ajax问题

    我有一个名为 post 的脚手架 它有标题和描述 在我的布局上 我有一个链接来创建一个新帖子 其中包含 remote gt true 当我单击该远程链接来更改 div 的内容以便我可以创建新帖子时 我该如何做到这一点 假设您将使用的操作称为
  • Unity DI 中的 AutoMapper 注册

    我对 Unity 或 StructureMap 不太熟悉 如何将以下 StructureMap 注册示例转换为 Unity 注册语法 public class ConfigurationRegistry Registry public Co
  • 如何使用docker日志

    这个问题可能有点新手 我跑docker exec it mycontainer bash进入守护进程容器 postgresQL 和echo某物 现在我退出它并使用docker logs mycontainer以便看到我的回声 根据 dock
  • 将 ConstraintLayout 项目对齐到两个项目的末尾

    我有一个 ConstraintLayout 其中有两个垂直堆叠的视图 A 和 B 我有第三个视图 C 它需要水平到达 A 和 B 的末端 在任何给定点 A 可能比 B 宽 反之亦然 因此约束不能仅基于一个视图 有没有办法通过视图 C 来定义
  • 如何压缩/最小化/打包我的 javascript? [复制]

    这个问题在这里已经有答案了 可能的重复 你用什么来最小化和压缩 JavaScript 库 https stackoverflow com questions 599911 what do you use to minimize and co
  • Django 中的“生成器对象”是什么?

    我正在使用 Django 投票包 当我在 shell 中使用方法 get top 时 它返回类似的内容 生成器对象位于 0x022f7AD0 我以前从未见过这样的东西 你如何访问它 它是什么 my code v Vote objects g
  • 如何同时设置TextView的maxLines和ellipsize

    我想将文本视图限制为最多 5 行 所以我这样做了
  • Python - 计算边邻接矩阵(折线图)的高效算法

    有谁知道一个有效的算法来计算边邻接矩阵 https www cmm ki si 7EFAMNIT knjiga wwwANG The Adjancency Matrix 5 htm 也称为折线图 L G https en wikipedia
  • Active Record 中的 Yii2 子查询

    如何将此 sql 转换为活动记录查询 SELECT FROM base twitter WHERE id NOT IN SELECT base id from base followers 假设你的模型被命名为BaseTwitter and
  • UICollectionView 与 CustomFlowLayout 如何将滚动限制为每次滚动仅一页?

    我已经实施了customFlowLayout在我的 iOS 应用程序中 我已经将targetContentOffsetForProposedContentOffset withScrollingVelocity和 子类化UICollecti
  • Form.Show() 稍微移动表单位置

    我有一个应用程序 它的主窗体充当一种框架 以及主窗体内的一个区域 我可以在其中打开其他窗体 这些表单不得关闭 因此当打开新表单时 我第一次使用此代码打开它 frm WindowState FormWindowState Maximized
  • 如何将数据帧信息的输出保存到 Excel 或文本文件

    我怎样才能写 df info 归档 我想将其包含在 excel 文件的工作表中 我在其中编写我的df使用df to excel 根据文档 pandas DataFrame info http pandas docs github io pa
  • Vue JS typescript 组件找不到注入实例属性

    我正在使用 typescript 和 vue 在我的应用程序中有一个service这是每个子组件的全局变量 I found 这个原生 vue 解决方案 https v2 vuejs org v2 guide components edge
  • BGL:如何有效地存储edge_descriptors和vertex_descriptors?

    因此 在解决了 BGL 的循环依赖问题之后 我遇到了另一个障碍 我目前正在使用邻接列表来对我的图进行建模 应用节点和边的捆绑属性来存储图中的一些信息 所以我有这样的事情 class Node int x int y position cla
  • 在 Observer 方法中,如何告诉 Magento 在分派事件后不处理代码

    我在结帐中有一些代码 我在会话中设置了一个密钥 如果该密钥在结帐中的任何位置设置为 false 我需要将它们发送回计费页面 我有它的代码 但我也不能拥有通常在观察者之后运行的任何代码 因为它将调用第三方服务并由于会话中缺少此密钥而返回错误
  • 重命名mysql数据库? [复制]

    这个问题在这里已经有答案了 如何使用查询重命名 MySQL 数据库名称 I tried rename通过 phpmyadmin 访问数据库并收到以下错误 SQL query RENAME DATABASE test TO test bkp
  • Android 中背景图像居中

    我有一个大约 100 x 100 的背景图像 我想将其放在 Android 应用程序的中心 有没有办法做到这一点 我认为这对于简单应用程序的方向改变会有很大帮助 对于这种情况 您可以使用 BitmapDrawable 创建 centered
  • 如何启动基本的WebRTC数据通道?

    如何启动基本的WebRTC数据通道 这是我到目前为止所拥有的 但它似乎甚至没有尝试连接 我确信我只是缺少一些基本的东西 var RTCPeerConnection window RTCPeerConnection window mozRTC