资讯专栏INFORMATION COLUMN

webRTC 初探

klinson / 2901人阅读

摘要:如果要多人会话,就要单对单建立多个连接。同样的步骤执行多次就可以了客户端代码开始结束发送打开页面即开启等待模式服务端代码

webRTC介绍

webRTC是英文Web Real-Time Communication的缩写,中文翻译网页实时通信,是浏览器不需要服务器的中转,可以直接通信的技术

webRTC 应用

网上的很多教程都会包含实时视频的介绍,不过我感觉视频看起来很酷,不过却不是webRTC的使用难点,却明显增加webRTC的使用复杂度,可以略过

webRTC是客户端对客户端的单对单实时通信,但是还是需要服务器,就好比一个婚介所的作用

下面我们通过socket.io作为服务器端实现简单的聊天功能

实现步骤

发起方向服务器发出通知并初始化RTCPeerConnection

服务器接收到通知通知接收并初始化RTCPeerConnection

双方都监听onicecandidate事件,并在回调里面把event.candidate上传到服务器

双发都监听ondatachannel事件,并在回调里面给event.channel监听onmessage事件

发起方调用createOffer方法,并在这个方法的回调中给自己的RTCPeerConnection实例设置setLocalDescription,并向服务器发送自己的Description

接收方在服务器推送给自己的消息里面把5中的Description设置为自己的RTCPeerConnection实例的RemoteDescription,并调用createAnswer方法,在此方法的回调之中设置setLocalDescription,并把自己的Description上传到服务器

发起方接收到服务器推送给自己的Description,设置为LocalDescription,至此双方连接建立

双方可以调用自己的channel的send方法发送文本消息

至于调用视频和音频,我觉着这部分使用起来比较简单,不绕

步骤就是一方的开启视频,获取视频流,添加到RTCPeerConnection实例中,连接的另外一方监听onaddstream事件,获取视频流,OK

多人会话的话,同一个RTCPeerConnection实例是不能够多人会话的。如果要多人会话,就要单对单建立多个连接。同样的步骤执行多次就可以了

客户端代码 html



  
  Title




js
var video = document.getElementById("video")
var localPeerConnection, remotePeerConnection
var localChannel

var socket = io.connect("http://localhost:8181")

// 打开页面即开启等待模式
startWaiting()

function startWaiting() {
  
  var servers = {
    "iceServers": [{
      "url": "stun:stun.l.google.com:19302"
    }]
  }

  var pc_constraints = {
    optional: [{
      DtlsSrtpKeyAgreement: true
    }]
  }

  localPeerConnection = new RTCPeerConnection(servers, pc_constraints)

  localChannel = localPeerConnection.createDataChannel("sendDataChannel", { reliable: true })

  localPeerConnection.onicecandidate = function(event) {
    if (event.candidate) {
      socket.emit("onicecandidate", event.candidate)
    }
  }

  localChannel.onopen = function() {
    console.log("open")
  }

  localChannel.onclose = function() {
    console.log("close")
  }

  localPeerConnection.ondatachannel = function(event) {
    console.log(event.channel)

    event.channel.onmessage = function(msg) {
      console.log("event msg", msg)
    }
  }


  socket.on("offer", function(desc) {
    console.log("offer: ", desc)
    localPeerConnection.setRemoteDescription(desc)
    setRemote = true
    localPeerConnection.createAnswer(function(desc) {
       localPeerConnection.setLocalDescription(desc)
       socket.emit("answer", desc)
    }, function(error){console.log(error)})
  })

  socket.on("answer", function(desc) {
    console.log("answer: ", desc)
    localPeerConnection.setRemoteDescription(desc)
    console.log("answer end")
    setRemote = true
  })

  socket.on("onicecandidate", function(icecandidate) {
    localPeerConnection.addIceCandidate(icecandidate)
  })




}

document.getElementById("start").onclick = function() {
  localPeerConnection.createOffer(function(desc) {
    localPeerConnection.setLocalDescription(desc)
    socket.emit("offer", desc)
  }, function(error){console.log(error)})
}

document.getElementById("send").onclick = function() {
  var value = document.getElementById("textarea").value
  localChannel.send(value)
}
服务端代码
var static = require("node-static")

var http = require("http")

var file = new(static.Server)()

var app = http.createServer(function (req, res) {
  file.serve(req, res);
}).listen(8181);

var io = require("socket.io").listen(app)

io.sockets.on("connection", function(socket) {

  socket.on("offer",function(desc) {
    socket.broadcast.emit("offer", desc)
  })

  socket.on("answer",function(desc) {
    socket.broadcast.emit("answer", desc)
  })

  socket.on("onicecandidate", function(candidate) {
    socket.broadcast.emit("onicecandidate", candidate)
  })

  socket.on("message", function(message) {
    socket.broadcast.to(message.channel).emit("message", message.message)
  })


})

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82720.html

相关文章

  • WebRTC 初探

    摘要:虽然是点对点通信,但还是需要服务器来初始化连接,并传递一些信息。服务器实现点对点通信的关键在于两个浏览器之间能直接发送和接收数据包,但一般情况下,浏览器或手机都是通过路由器访问,所以存在网络地址转换。 WebRTC 浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转。比如现在有两个客户端,甲和乙,他们俩想要通信,首先需要甲和服务器、乙和服务器之间建立信道。甲给乙发送消...

    williamwen1986 评论0 收藏0
  • Hola~ 一款基于Electron的聊天软件

    摘要:前言本项目旨在从零到壹,制作一款界面精美的聊天软件。因为本人是开发,设计功底欠缺,所以软件设计的有点丑,如果有大神有更好的,欢迎。 Hola 前言 本项目旨在从零到壹,制作一款界面精美的聊天软件。 Github 地址因为已工作,所以可能没有多少时间来继续跟进这个项目了,项目可优化的点已在下文列出,欢迎大家 Fork 或 Star。 ps: 征 logo 一枚。因为本人是开发,设计功底...

    Kaede 评论0 收藏0
  • WebRTC入门教程(三) | Android 端如何使用 WebRTC

    摘要:下面我们就看一下具体如何申请权限静态权限申请在项目中的中增加以下代码动态权限申请随着的发展,对安全性要求越来越高。其定义如下通过上面的代码我们就将显示视频的定义好了。当发送消息,并收到服务端的后,其状态变为。 作者:李超,如遇到相关问题,可以点击这里与作者直接交流。 前言 在学习 WebRTC 的过程中,学习的一个基本步骤是先通过 JS 学习 WebRTC的整体流程,在熟悉了整体流程之后,...

    番茄西红柿 评论0 收藏0
  • WebRTC 及点对点网络通信机制

    摘要:本质上允许网页程序创建点对点通信,我们将会在随后的章节中进行介绍。信令涉及网络检索和穿透,会话创建及管理,通信安全,媒体功能元数据和调制及错误处理。这样就会完全建立及激活节点间的网络套接字会话。 原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland。 这是 JavaScript 工作原理第十八章。 概述 何为 WebRTC ?首先,字面上已经...

    Rango 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<