前段時間由於公司業務需要準備在**上做乙個即時聊天的功能,苦於本人從業經驗尚淺毫無頭緒。查了些資料問了下大神決定使用nodejs+sock.io來寫這個即時聊天功能。下面是本人做的一些探索。囿於本人技術有限,難免有錯誤,希望大神路過共同**指教。
第乙個方案是ajax輪詢,前端用setinterval()每5秒去查一次資料庫有沒有最新訊息。由於公司使用的mysql資料庫庫,頻繁讀寫一旦訪問量大了資料庫有點懸。
第二個方案就是php建立socket長連線,通過socket推送訊息給客戶端。這裡我找到了workeman,不過想接觸下nodejs就pass掉了。
第三個方案就是nodej+soket.io。其實和第二個方案原理是一樣的,也是通過socket建立長連線推送訊息,只不過乙個是用apache+php做服務端,乙個是nodejs做服務端。
最終我採用了第三個方案。
準備工作:
我選擇了編譯好的包直接wget到home目錄下(忘了說,公司使用的伺服器是阿里雲centos6.5)。
解壓#tar -vzf node-v6.10.2-linux-x64.tar.xz
改名#mv node-v6.10.2-linux-x64.tar.xz nodejs
建立軟連線
#ln -s nodejs/bin/npm /usr/local/bin/npm
#ln -s nodejs/bin/node /usr/local/bin/node
檢查版本號
#node -v
#npm -v
#npm -g socket.io
#npm -g redis
#npm -g mysql
開始寫服務端,取名叫chat.js 放在home/codex目錄下,**如下:
var io = require('/home/nodejs/lib/node_modules/socket.io').listen(8086);
var fs = require('fs');//可要可不要,打算用來寫日誌的
var redis = require('/home/nodejs/lib/node_modules/redis');
var rds = redis.createclient(6379,'127.0.0.1');//連線redis
io.on('connection', function(socket));
//監聽使用者退出
socket.on('disconnect', function());
//監聽使用者發布聊天內容
socket.on('message', function(obj)
})io.emit('message',obj);
});});
寫得超級簡單,只用到了emit廣播,沒有單獨發資訊給某個使用者。就是只是監聽了message,每條訊息都存到redis佇列中,到了1000條就刪除最舊的一條訊息來保持列隊最多存1000條。在推送物件obj裡面可以帶註冊使用者的id,在前段js接收到服務端廣播後根據訊息帶的id分辨出是發給誰的。推送訊息的時候要注意,發給對方的同時要推送一條給自己。
用Jabber構建自己的即時聊天系統
jabber分為伺服器端和客戶端.任意的客戶端都能與任意的服務端進行連線.gtalk就是乙個jabber標準的服務.用任意的客戶端都可以用gmail帳戶登入gtalk伺服器.jabber的常用伺服器有 jabber的常用客戶端有 platform suggestions windows exodus...
基於NodeJS的秘室聊天室
本次聊天室我給它定義了乙個名稱叫 秘密聊天室 需求 技術選型 後端 nodejs,socket.io,中介軟體 express,body parser,multer,ejs mongoose express 是nodejs web應用框架,主要是要理解它的router body parser 用於獲...
windows 上 nodejs的全域性配置
安裝node.js 本地安裝 將安裝包放在 node modules 下 執行npm時所在的目錄 可以通過 require 來引入本地安裝的包 全域性安裝 可以直接在命令列裡使用 為什麼全域性安裝後還要本地安裝 僅全域性安裝足夠嗎?1.在js例項 中,預設下nodejs會在node path和目前j...