网页上的即时聊天--nodejs学习笔记
?????????????????? 前段時間由于公司業務需要準備在網站上做一個即時聊天的功能,苦于本人從業經驗尚淺毫無頭緒。查了些資料問了下大神決定使用nodejs+sock.io來寫這個即時聊天功能。下面是本人做的一些探索。囿于本人技術有限,難免有錯誤,希望大神路過共同探討指教。
第一個方案是ajax輪詢,前端用setinterval()每5秒去查一次數據庫有沒有最新消息。由于公司使用的mysql數據庫庫,頻繁讀寫一旦訪問量大了數據庫有點懸。
第二個方案就是PHP建立socket長連接,通過socket推送消息給客戶端。這里我找到了workeman,不過想接觸下nodejs就pass掉了。
第三個方案就是nodej+soket.io。其實和第二個方案原理是一樣的,也是通過socket建立長連接推送消息,只不過一個是用Apache+PHP做服務端,一個是nodejs做服務端。
最終我采用了第三個方案。
準備工作:
1、下載nodejs
剛開始接觸node不太熟悉,去nodejs中文網下載了安裝包,版本6.9.1
我選擇了編譯好的包直接wget到home目錄下(忘了說,公司使用的服務器是阿里云centos6.5)。
下載# wget http://pan.baidu.com/s/1o8lqQTW#list/vmode=grid&path=%2Fnodejs.cn%2Fv6.10.2%2Flinux-x64.tar.xz
解壓#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
顯示版本號正常,下載socket.io、redis、msql
#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('login', function(obj){
??????????? 將新加入用戶的唯一標識當作socket的名稱,后面退出的時候會用到
??????????? socket.name = obj;
??????????? io.emit('message', '~['+socket.name+']加入了聊天室~');
??????????? //console.log(socket.name+'加入了聊天室');
?? });
??????????? //監聽用戶退出
??????????? socket.on('disconnect', function(){
??????????????????????? //退出通知
??????????? });
??????????? //監聽用戶發布聊天內容
??????????? socket.on('message', function(obj){
????????????????????
????????????????????? rds.rpush('msglist',obj,function(stat,num){
??????????????????????????????? if(num>2000){
?????????????????????????????????? rds.lpop('msglist');
??????????????????????????????? }
????????????????????? })
????????????????????? io.emit('message',obj);
?????????? });
?});
?????
寫得超級簡單,只用到了emit廣播,沒有單獨發信息給某個用戶。就是只是監聽了message,每條消息都存到redis隊列中,到了1000條就刪除最舊的一條消息來保持列隊最多存1000條。在推送對象obj里面可以帶注冊用戶的id,在前段js接收到服務端廣播后根據消息帶的id分辨出是發給誰的。推送消息的時候要注意,發給對方的同時要推送一條給自己。
總結
以上是生活随笔為你收集整理的网页上的即时聊天--nodejs学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: http1.0和http1.1和http
- 下一篇: pytest+allure生成漂亮的报告