nodejs结合socket.io实现websocket通信功能的方法


Posted in NodeJs onJanuary 12, 2018

本文实例讲述了nodejs结合socket.io实现websocket通信功能的方法。分享给大家供大家参考,具体如下:

因为项目中有需要实时获取后台数据的场景,之前一直是使用http心跳请求的方法。因为websocket与此模式相比有很大的性能提升,而且可以提高实时性,所以对websocket作了一些研究。这里是使用nodejs+socket.io来实现的。

达成目标

将原来心跳请求后台数据的方式,修改为通过socket连接后台统一推送的方式。后台的数据由别的进程写入文件或写入redis,这里实现的是读取文件的方式。

前期准备

安装nodejs(略)

服务器端

新建一个项目目录,这里是sockettest
进入sockettest目录,安装express模块和socketio模块

npm install --save express@4.10.2
npm install --save socket.io

新建package.json文件,在其中写入如下内容:

{
 "name": "socket-test",
 "version": "0.0.1",
 "description": "my first socket.io app",
 "dependencies": {
  "express": "^4.10.2",
  "socket.io": "^1.7.2"
 }
}

新建index.html,用于作为默认的访问显示页面,因为这里不会用到它,内容随意;
新建trends.js文件,在其中写入内容:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var fs = require('fs');
#默认打开文件
app.get('/', function(req, res){
  res.sendfile('index.html');
});
#用于存储所有socket以广播数据
var iolist = [];
#定义socket on connection(连入)事件行为
io.on('connection', function(socket){
  #将连入socket加入列表
  iolist.push(socket); 
  #记录index,在disconnect(断开连接)发生时将对应的socket删除
  var sockex = iolist.indexOf(socket); 
  #定义on disconnect事件行为
  socket.on('disconnect', function(){
    #将断开连接的socket从广播列表里删除
    iolist.splice(sockex, 1);
  });
});
# 数据广播进程:每1秒钟广播一次
setInterval(function() {
  # 如果没有正在连接的socket,直接返回;
  if (iolist.length <= 0) return;
  var trends = fs.readFileSync('./data/trends.json','utf-8');#trends数据
  var coins = fs.readFileSync('./data/coins.json','utf-8');#coins数据
  #向所有socket连接发送数据
  for (i in iolist) {
    # 向客户端发送trends数据
    iolist[i].emit('trends', trends);
    # 向客户端发送coins数据
    iolist[i].emit('coins', coins);
  }
}, 1000);
# 服务器侦听在sockettest.com的3000端口上
http.listen(3000, function(){
  # 输出到标准输出
  console.log('listening on sockettest.com:3000');
});

新建data目录,并在下面新建两个文件trends与coins,用于存放socket服务器将要读取的数据。
新建public目录,在其中新建一个文件index.html,文件内容如下:

<!--引入必要的js文件-->
<script type="text/javascript" src="http://sockettest:3000/socket.io/socket.io.js"></script>
<script type="text/javascript">
    //新建socket
    var socket = io('http://sockettest.com:3000');
    socketdata(socket);
    function socketdata() {
      #定义接收到coins类型数据时的行为
      socket.on('coins', function(msg){
        console.log(msg);
      }
      #定义接收到trends类型数据时的行为
      socket.on('trends', function(msg){
        console.log(msg);
      }
    }
</script>

代码部署

刚才之所以要建两个index.html文件,是为了能够方便地在既有的web项目中使用nodejs提供的socket服务。这样我们把public/index.html可以部署在别的服务器中,比如nginx或tomcat之类,然后在根目下启动socket的服务器,为其提供socket服务。
首先在刚才的项目根目录下执行

node ./trends.js

并保持终端运行,然后再把项目部署在nginx里,通过chrome下访问nginx提供的web服务:

http://hostname/public/index.html

打开开发者模式,就能在console里看到每隔一秒便会收到来自node服务器的socket推送消息了。通过修改data目录下的两个文件,可以看到写入到文件的数据也会实时地推送到客户端这里来。

参考文章

http://socket.io/get-started/chat/

希望本文所述对大家nodejs程序设计有所帮助。

NodeJs 相关文章推荐
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 NodeJs
nodejs教程之制作一个简单的文章发布系统
Nov 21 NodeJs
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
Dec 18 NodeJs
nodejs中向HTTP响应传送进程的输出
Mar 19 NodeJs
NodeJs测试框架Mocha的安装与使用
Mar 28 NodeJs
nodejs个人博客开发第五步 分配数据
Apr 12 NodeJs
详解Nodejs之静态资源处理
Jun 05 NodeJs
nodejs中解决异步嵌套循环和循环嵌套异步的问题
Jul 12 NodeJs
使用Nodejs连接mongodb数据库的实现代码
Aug 21 NodeJs
nodejs初始化init的示例代码
Oct 10 NodeJs
使用koa-log4管理nodeJs日志笔记的使用方法
Nov 30 NodeJs
nodejs实现日志读取、日志查找及日志刷新的方法分析
May 20 NodeJs
nodejs结合Socket.IO实现的即时通讯功能详解
Jan 12 #NodeJs
nodejs基于WS模块实现WebSocket聊天功能的方法
Jan 12 #NodeJs
nodejs使用http模块发送get与post请求的方法示例
Jan 08 #NodeJs
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
Jan 05 #NodeJs
Nodejs连接mysql并实现增、删、改、查操作的方法详解
Jan 04 #NodeJs
nodejs简单实现TCP服务器端和客户端的聊天功能示例
Jan 04 #NodeJs
详解NODEJS的http实现
Jan 04 #NodeJs
You might like
ThinkPHP实现递归无级分类――代码少
2015/07/29 PHP
PHP实现的AES加密、解密封装类与用法示例
2018/08/02 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
document.open() 与 document.write()的区别
2007/08/13 Javascript
javascript的switch用法注意事项分析
2015/02/02 Javascript
常用的JavaScript WEB操作方法分享
2015/02/28 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
浅谈javascript alert和confirm的美化
2016/12/15 Javascript
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
2017/09/19 NodeJs
详解vue 命名视图
2019/08/14 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
把大数据数字口语化(python与js)两种实现
2013/02/21 Python
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
python数据结构学习之实现线性表的顺序
2018/09/28 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
2019/09/02 Python
Python中的list与tuple集合区别解析
2019/10/12 Python
Python FTP文件定时自动下载实现过程解析
2019/11/12 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
python能在浏览器能运行吗
2020/06/17 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
2021/01/12 Python
HTML5边玩边学(3)像素和颜色
2010/09/21 HTML / CSS
Staples美国官方网站:办公用品一站式采购
2016/07/28 全球购物
法国创作个性化T恤衫和其他定制产品平台:Tostadora
2018/04/08 全球购物
Glamest意大利:女性在线奢侈品零售店
2019/04/28 全球购物
澳大利亚运动鞋商店:Platypus Shoes
2019/09/27 全球购物
写出二分查找算法的两种实现
2013/05/13 面试题
abstract class和interface有什么区别
2013/08/04 面试题
加入学生会演讲稿
2014/04/24 职场文书
提拔干部考察材料
2014/05/26 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
就业意向书范本
2015/05/11 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
2021/06/07 Python