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 相关文章推荐
nodejs文件操作模块FS(File System)常用函数简明总结
Jun 05 NodeJs
使用Nodejs开发微信公众号后台服务实例
Sep 03 NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 NodeJs
nodejs初步体验篇
Nov 23 NodeJs
基于nodejs+express4.X实现文件下载的实例代码
Jul 13 NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 NodeJs
详解NODEJS的http实现
Jan 04 NodeJs
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
Jan 05 NodeJs
nodejs爬虫初试superagent和cheerio
Mar 05 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 NodeJs
nodejs 递归拷贝、读取目录下所有文件和目录
Jul 18 NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 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
PHP CLI模式下的多进程应用分析
2013/06/03 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
Javascript 继承机制的实现
2009/08/12 Javascript
js 数组克隆方法 小结
2010/03/20 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
Bootstrap项目实战之子栏目资讯内容
2016/04/25 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
JS 全屏和退出全屏详解及实例代码
2016/11/07 Javascript
基于Vue单文件组件详解
2017/09/15 Javascript
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
vue如何自动化打包测试环境和正式环境的dist/test文件
2019/06/06 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
Python中循环后使用list.append()数据被覆盖问题的解决
2018/07/01 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
PyCharm代码提示忽略大小写设置方法
2018/10/28 Python
Python 加密与解密小结
2018/12/06 Python
python实现猜数游戏
2020/03/27 Python
什么是python的id函数
2020/06/11 Python
浅谈TensorFlow中读取图像数据的三种方式
2020/06/30 Python
python简单实现9宫格图片实例
2020/09/03 Python
Python抓包并解析json爬虫的完整实例代码
2020/11/03 Python
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
给幼儿园老师的表扬信
2014/01/19 职场文书
新闻专业学生的自我评价
2014/02/13 职场文书
中职生求职信
2014/07/01 职场文书
车辆转让协议书
2014/09/24 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
升学宴家长致辞
2015/07/27 职场文书
安全生产奖惩制度
2015/08/06 职场文书
2019商业计划书格式、范文
2019/04/24 职场文书
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript