溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

node.js + socket.io怎么實(shí)現(xiàn)點(diǎn)對點(diǎn)隨機(jī)匹配聊天

發(fā)布時間:2021-05-21 14:09:25 來源:億速云 閱讀:235 作者:小新 欄目:web開發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)node.js + socket.io怎么實(shí)現(xiàn)點(diǎn)對點(diǎn)隨機(jī)匹配聊天,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

先說說用到的東西, node 用來做后臺服務(wù),express 用來托管靜態(tài)資源,然后socket.io 用來傳送聊天數(shù)據(jù)。接下來說說思路,其實(shí)用socket.io來傳數(shù)據(jù)是很簡單的一件事情,我們只需要再前端頁面引入 socket.io.js  然后再node端也require('socket.io'),把它在后端跑起來,那么前端就可以通過如下代碼來發(fā)送或者接收信息。

//前端
socket = io.connect('ws://'+'服務(wù)器ip');
socket.emit('msg',{msg:'前端要發(fā)送的信息'});//要發(fā)送的信息(以對象的形式發(fā)送)
socket.on('msg2',function(data){
  ...
  //這里的data是后端傳過來的信息
})
//后端
socket.on('msg',function(data){
  var data = data; //這里的data就是前端傳過來的數(shù)據(jù),即{msg:'前端要發(fā)送的信息'}
  console.log(data.msg) // 打印出 “前端要發(fā)送的信息”
})
//同理,后端要傳信息給前端也是一樣
socket.emit('msg2',{msg:'后端要發(fā)送的信息'});

我們來看后端怎么把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){ //當(dāng)前端執(zhí)行 socket = io.connect('ws://'+host); 的時候,此處的io會監(jiān)聽到connection事件
 socket.on('msg',function(data){ 
 io.emit('onlineCount',freeList)
 //如果直接用io.emit來發(fā)送數(shù)據(jù)的話,這代表廣播的形式,就是當(dāng)前所有打開服務(wù)的前端頁面都會收到這條消息。
 
   socket.emit('welcome',{msg:'歡迎...'})//這里將給當(dāng)前連接的頁面發(fā)送一個歡迎的對象數(shù)據(jù)
 })
 socket.on('disconnect',function(){
 //當(dāng)前端頁面關(guān)閉,或者失去連接時,后端會接收到disconnect事件
   
 })

})
http.listen(4000, function(){
 console.log('listening on *:4000');
});

當(dāng)然不僅如此,因?yàn)閣ebsocket協(xié)議,是在瀏覽器和服務(wù)器之間建立了一個長鏈接來相互傳輸數(shù)據(jù),對服務(wù)器而言,如果打開了好幾個頁面,那么就有好幾個socket實(shí)例,每個建立連接的前端頁面都會有一個socket實(shí)例,這樣就為接下來的點(diǎn)對點(diǎn)私聊提供了思路。當(dāng)然,我們也可以通過直接廣播來傳送信息,不過這適用于聊天室情景。

那如何實(shí)現(xiàn)點(diǎn)對點(diǎn)呢,之前說了,每個建立連接的頁面都會產(chǎn)生一個socket實(shí)例,那么我們只需要后端在接收消息的同時,判斷該socket實(shí)例是和哪個個實(shí)例在聊天,只把消息發(fā)送給另一個匹配的socket實(shí)例就好了。簡單來說就像寫信一樣,我把消息發(fā)送給后端,然后告訴后端,這個消息是給xxx的,然后后端找到xxx對應(yīng)的socket實(shí)例,將消息發(fā)給他就好了。

//前端
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的對應(yīng)值,這樣,就可以通過每次發(fā)送信息時,附帶要接收對象的id來達(dá)到點(diǎn)對點(diǎn)的數(shù)據(jù)傳輸。

關(guān)于“node.js + socket.io怎么實(shí)現(xiàn)點(diǎn)對點(diǎn)隨機(jī)匹配聊天”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI