真心佩服那些可以經常發布筆記的人,其實我也想經常發來的,奈何技術不夠加上懶,要向大神們多多學習了,前段時間有用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);//每次登錄,獲取一個唯一的用戶idsocket = 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啊等等,鑒于我表達能力有限,加上懶,就不 主站蜘蛛池模板: 周宁县| 正安县| 泰安市| 长春市| 霍城县| 宝兴县| 西城区| 高安市| 桃源县| 翁源县| 平昌县| 响水县| 郧西县| 黎川县| 仪征市| 阜阳市| 内丘县| 宣汉县| 绥中县| 揭东县| 山阴县| 德州市| 大同县| 北川| 云和县| 沈丘县| 民乐县| 吉木萨尔县| 白朗县| 英超| 威信县| 库伦旗| 蚌埠市| 泸西县| 大新县| 江阴市| 保康县| 上蔡县| 五河县| 玉田县| 桓仁|