成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

webRTC 初探

klinson / 3126人閱讀

摘要:如果要多人會(huì)話(huà),就要單對(duì)單建立多個(gè)連接。同樣的步驟執(zhí)行多次就可以了客戶(hù)端代碼開(kāi)始結(jié)束發(fā)送打開(kāi)頁(yè)面即開(kāi)啟等待模式服務(wù)端代碼

webRTC介紹

webRTC是英文Web Real-Time Communication的縮寫(xiě),中文翻譯網(wǎng)頁(yè)實(shí)時(shí)通信,是瀏覽器不需要服務(wù)器的中轉(zhuǎn),可以直接通信的技術(shù)

webRTC 應(yīng)用

網(wǎng)上的很多教程都會(huì)包含實(shí)時(shí)視頻的介紹,不過(guò)我感覺(jué)視頻看起來(lái)很酷,不過(guò)卻不是webRTC的使用難點(diǎn),卻明顯增加webRTC的使用復(fù)雜度,可以略過(guò)

webRTC是客戶(hù)端對(duì)客戶(hù)端的單對(duì)單實(shí)時(shí)通信,但是還是需要服務(wù)器,就好比一個(gè)婚介所的作用

下面我們通過(guò)socket.io作為服務(wù)器端實(shí)現(xiàn)簡(jiǎn)單的聊天功能

實(shí)現(xiàn)步驟

發(fā)起方向服務(wù)器發(fā)出通知并初始化RTCPeerConnection

服務(wù)器接收到通知通知接收并初始化RTCPeerConnection

雙方都監(jiān)聽(tīng)onicecandidate事件,并在回調(diào)里面把event.candidate上傳到服務(wù)器

雙發(fā)都監(jiān)聽(tīng)ondatachannel事件,并在回調(diào)里面給event.channel監(jiān)聽(tīng)onmessage事件

發(fā)起方調(diào)用createOffer方法,并在這個(gè)方法的回調(diào)中給自己的RTCPeerConnection實(shí)例設(shè)置setLocalDescription,并向服務(wù)器發(fā)送自己的Description

接收方在服務(wù)器推送給自己的消息里面把5中的Description設(shè)置為自己的RTCPeerConnection實(shí)例的RemoteDescription,并調(diào)用createAnswer方法,在此方法的回調(diào)之中設(shè)置setLocalDescription,并把自己的Description上傳到服務(wù)器

發(fā)起方接收到服務(wù)器推送給自己的Description,設(shè)置為LocalDescription,至此雙方連接建立

雙方可以調(diào)用自己的channel的send方法發(fā)送文本消息

至于調(diào)用視頻和音頻,我覺(jué)著這部分使用起來(lái)比較簡(jiǎn)單,不繞

步驟就是一方的開(kāi)啟視頻,獲取視頻流,添加到RTCPeerConnection實(shí)例中,連接的另外一方監(jiān)聽(tīng)onaddstream事件,獲取視頻流,OK

多人會(huì)話(huà)的話(huà),同一個(gè)RTCPeerConnection實(shí)例是不能夠多人會(huì)話(huà)的。如果要多人會(huì)話(huà),就要單對(duì)單建立多個(gè)連接。同樣的步驟執(zhí)行多次就可以了

客戶(hù)端代碼 html



  
  Title




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

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

// 打開(kāi)頁(yè)面即開(kāi)啟等待模式
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)
}
服務(wù)端代碼
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)
  })


})

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/82720.html

相關(guān)文章

  • WebRTC 初探

    摘要:雖然是點(diǎn)對(duì)點(diǎn)通信,但還是需要服務(wù)器來(lái)初始化連接,并傳遞一些信息。服務(wù)器實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信的關(guān)鍵在于兩個(gè)瀏覽器之間能直接發(fā)送和接收數(shù)據(jù)包,但一般情況下,瀏覽器或手機(jī)都是通過(guò)路由器訪問(wèn),所以存在網(wǎng)絡(luò)地址轉(zhuǎn)換。 WebRTC 瀏覽器本身不支持相互之間直接建立信道進(jìn)行通信,都是通過(guò)服務(wù)器進(jìn)行中轉(zhuǎn)。比如現(xiàn)在有兩個(gè)客戶(hù)端,甲和乙,他們倆想要通信,首先需要甲和服務(wù)器、乙和服務(wù)器之間建立信道。甲給乙發(fā)送消...

    williamwen1986 評(píng)論0 收藏0
  • Hola~ 一款基于Electron的聊天軟件

    摘要:前言本項(xiàng)目旨在從零到壹,制作一款界面精美的聊天軟件。因?yàn)楸救耸情_(kāi)發(fā),設(shè)計(jì)功底欠缺,所以軟件設(shè)計(jì)的有點(diǎn)丑,如果有大神有更好的,歡迎。 Hola 前言 本項(xiàng)目旨在從零到壹,制作一款界面精美的聊天軟件。 Github 地址因?yàn)橐压ぷ?,所以可能沒(méi)有多少時(shí)間來(lái)繼續(xù)跟進(jìn)這個(gè)項(xiàng)目了,項(xiàng)目可優(yōu)化的點(diǎn)已在下文列出,歡迎大家 Fork 或 Star。 ps: 征 logo 一枚。因?yàn)楸救耸情_(kāi)發(fā),設(shè)計(jì)功底...

    Kaede 評(píng)論0 收藏0
  • WebRTC入門(mén)教程(三) | Android 端如何使用 WebRTC

    摘要:下面我們就看一下具體如何申請(qǐng)權(quán)限靜態(tài)權(quán)限申請(qǐng)?jiān)陧?xiàng)目中的中增加以下代碼動(dòng)態(tài)權(quán)限申請(qǐng)隨著的發(fā)展,對(duì)安全性要求越來(lái)越高。其定義如下通過(guò)上面的代碼我們就將顯示視頻的定義好了。當(dāng)發(fā)送消息,并收到服務(wù)端的后,其狀態(tài)變?yōu)椤?作者:李超,如遇到相關(guān)問(wèn)題,可以點(diǎn)擊這里與作者直接交流。 前言 在學(xué)習(xí) WebRTC 的過(guò)程中,學(xué)習(xí)的一個(gè)基本步驟是先通過(guò) JS 學(xué)習(xí) WebRTC的整體流程,在熟悉了整體流程之后,...

    番茄西紅柿 評(píng)論0 收藏0
  • WebRTC 及點(diǎn)對(duì)點(diǎn)網(wǎng)絡(luò)通信機(jī)制

    摘要:本質(zhì)上允許網(wǎng)頁(yè)程序創(chuàng)建點(diǎn)對(duì)點(diǎn)通信,我們將會(huì)在隨后的章節(jié)中進(jìn)行介紹。信令涉及網(wǎng)絡(luò)檢索和穿透,會(huì)話(huà)創(chuàng)建及管理,通信安全,媒體功能元數(shù)據(jù)和調(diào)制及錯(cuò)誤處理。這樣就會(huì)完全建立及激活節(jié)點(diǎn)間的網(wǎng)絡(luò)套接字會(huì)話(huà)。 原文請(qǐng)查閱這里,略有刪減,本文采用知識(shí)共享署名 4.0 國(guó)際許可協(xié)議共享,BY Troland。 這是 JavaScript 工作原理第十八章。 概述 何為 WebRTC ?首先,字面上已經(jīng)...

    Rango 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<