摘要:如果要多人會話,就要單對單建立多個連接。同樣的步驟執行多次就可以了客戶端代碼開始結束發送打開頁面即開啟等待模式服務端代碼
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實例是不能夠多人會話的。如果要多人會話,就要單對單建立多個連接。同樣的步驟執行多次就可以了
客戶端代碼 htmlTitle
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) }) })
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82720.html
摘要:雖然是點對點通信,但還是需要服務器來初始化連接,并傳遞一些信息。服務器實現點對點通信的關鍵在于兩個瀏覽器之間能直接發送和接收數據包,但一般情況下,瀏覽器或手機都是通過路由器訪問,所以存在網絡地址轉換。 WebRTC 瀏覽器本身不支持相互之間直接建立信道進行通信,都是通過服務器進行中轉。比如現在有兩個客戶端,甲和乙,他們倆想要通信,首先需要甲和服務器、乙和服務器之間建立信道。甲給乙發送消...
摘要:前言本項目旨在從零到壹,制作一款界面精美的聊天軟件。因為本人是開發,設計功底欠缺,所以軟件設計的有點丑,如果有大神有更好的,歡迎。 Hola 前言 本項目旨在從零到壹,制作一款界面精美的聊天軟件。 Github 地址因為已工作,所以可能沒有多少時間來繼續跟進這個項目了,項目可優化的點已在下文列出,歡迎大家 Fork 或 Star。 ps: 征 logo 一枚。因為本人是開發,設計功底...
摘要:下面我們就看一下具體如何申請權限靜態權限申請在項目中的中增加以下代碼動態權限申請隨著的發展,對安全性要求越來越高。其定義如下通過上面的代碼我們就將顯示視頻的定義好了。當發送消息,并收到服務端的后,其狀態變為。 作者:李超,如遇到相關問題,可以點擊這里與作者直接交流。 前言 在學習 WebRTC 的過程中,學習的一個基本步驟是先通過 JS 學習 WebRTC的整體流程,在熟悉了整體流程之后,...
摘要:本質上允許網頁程序創建點對點通信,我們將會在隨后的章節中進行介紹。信令涉及網絡檢索和穿透,會話創建及管理,通信安全,媒體功能元數據和調制及錯誤處理。這樣就會完全建立及激活節點間的網絡套接字會話。 原文請查閱這里,略有刪減,本文采用知識共享署名 4.0 國際許可協議共享,BY Troland。 這是 JavaScript 工作原理第十八章。 概述 何為 WebRTC ?首先,字面上已經...
閱讀 2706·2021-11-11 16:54
閱讀 2328·2021-10-09 09:44
閱讀 2547·2019-08-30 15:54
閱讀 1935·2019-08-30 11:24
閱讀 1174·2019-08-29 17:03
閱讀 2106·2019-08-29 16:22
閱讀 2086·2019-08-29 13:11
閱讀 1043·2019-08-29 12:14