這篇文章主要介紹了node.js + socket.io 實現點對點隨機匹配聊天,具有一定的參考價值,感興趣的小伙伴們可以參考一下
真心佩服那些可以經常發布筆記的人,其實我也想經常發來的,奈何技術不夠加上懶,要向大神們多多學習了,前段時間有用bomb平台自帶的socket寫一個聊天室,其實基本就是改了改它的demo,這次想實現一個隨機私聊,所以自己基於node 和socket.io 來搭服務,當然,第一次用node做東西玩,雖然做的不好,但是也蠻分享下哈。
先說說用到的東西, node 用來做後台服務,express 用來託管靜態資源,然後socket.io 用來傳送聊天資料。接下來說說思路,其實用socket.io來傳資料是很簡單的一件事情,我們只需要再前端頁面引入socket.io.js 然後再node端也require('socket. io'),把它在後端跑起來,那麼前端就可以透過以下程式碼來發送或接收訊息。
//前端 socket = io.connect('ws://'+'服务器ip'); socket.emit('msg',{msg:'前端要发送的信息'});//要发送的信息(以对象的形式发送) socket.on('msg2',function(data){ ... //这里的data是后端传过来的信息 }) //后端 socket.on('msg',function(data){ var data = data; //这里的data就是前端传过来的数据,即{msg:'前端要发送的信息'} console.log(data.msg) // 打印出 “前端要发送的信息” }) //同理,后端要传信息给前端也是一样 socket.emit('msg2',{msg:'后端要发送的信息'});
我們來看後端怎麼把socket跑起來
var express = require('express'); var app = express(); var http = require('http').Server(app); var io = require('socket.io')(http); io.on('connection', function(socket){ //当前端执行 socket = io.connect('ws://'+host); 的时候,此处的io会监听到connection事件 socket.on('msg',function(data){ io.emit('onlineCount',freeList) //如果直接用io.emit来发送数据的话,这代表广播的形式,就是当前所有打开服务的前端页面都会收到这条消息。 socket.emit('welcome',{msg:'欢迎...'})//这里将给当前连接的页面发送一个欢迎的对象数据 }) socket.on('disconnect',function(){ //当前端页面关闭,或者失去连接时,后端会接收到disconnect事件 }) }) http.listen(4000, function(){ console.log('listening on *:4000'); });
當然不只如此,因為websocket協議,是在瀏覽器和伺服器之間建立了一個長連結來相互傳輸數據,對伺服器而言,如果打開了好幾個頁面,那麼就有好幾個socket實例,每個建立連接的前端頁面都會有一個socket實例,這樣就為接下來的點對點私聊提供了思路。當然,我們也可以透過直接廣播來傳送訊息,不過這適用於聊天室情境。
那如何實現點對點呢,之前說了,每個建立連接的頁面都會產生一個socket實例,那麼我們只需要後端在接收訊息的同時,判斷這個socket實例是和哪個個實例在聊天,只把訊息傳送給另一個符合的socket實例就好了。簡單來說就像寫信一樣,我把訊息傳送給後端,然後告訴後端,這個訊息是給xxx的,然後後端找到xxx對應的socket實例,將訊息發給他就好了。
//前端 window.id = new Date().getTime()+""+Math.floor(Math.random()*899+100); //每次登录,获取一个唯一的用户id socket = io.connect('ws://'+host); socket.emit('newUser',{ user_name : name, user_id : id}) //建立连接后,将我的用户名和id都传给后端 //后端 socket.on('newUser',function(data){ var nickname = data.user_name, user_id = data.user_id; userServer[user_id] = socket; //后端接收后,将该用户socket保存在一个对象里,key值为id,value就是这个用户的socket })
透過上面的程式碼,後端得到了一個userServer的對象,裡面是每個連接socket和其id的對應值,這樣,就可以透過每次發送訊息時,附帶要接收物件的id來達到點對點的資料傳輸。
接下來就是資料處理咯,如何取到對方的id啊等等,鑑於我表達能力有限,加上懶,就不囉嗦啦~~ 程式碼我都託管在github歡迎自己下下來看咯
以上是node.js + socket.io 實作聊天功能詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Linux新版
SublimeText3 Linux最新版

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3漢化版
中文版,非常好用