摘要:如果要多人會(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ù)端代碼 htmlTitle
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
摘要:雖然是點(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ā)送消...
摘要:前言本項(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ì)功底...
摘要:下面我們就看一下具體如何申請(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的整體流程,在熟悉了整體流程之后,...
摘要:本質(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)...
閱讀 2766·2021-11-11 16:54
閱讀 2405·2021-10-09 09:44
閱讀 2668·2019-08-30 15:54
閱讀 1987·2019-08-30 11:24
閱讀 1251·2019-08-29 17:03
閱讀 2168·2019-08-29 16:22
閱讀 2144·2019-08-29 13:11
閱讀 1117·2019-08-29 12:14