日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

网页上的即时聊天--nodejs学习笔记

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网页上的即时聊天--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学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。