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 sublime text 3安装与配置
Jun 19 NodeJs
Nodejs学习笔记之NET模块
Jan 13 NodeJs
nodejs入门教程三:调用内部和外部方法示例
Apr 24 NodeJs
nodejs入门教程五:连接数据库的方法分析
Apr 24 NodeJs
深入解析nodejs HTTP服务
Jul 25 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
nodejs对express中next函数的一些理解
Sep 08 NodeJs
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
Jan 05 NodeJs
NodeJS 中Stream 的基本使用
Jul 30 NodeJs
Nodejs 识别图片类型的方法
Aug 15 NodeJs
NodeJS http模块用法示例【创建web服务器/客户端】
Nov 05 NodeJs
一文秒懂nodejs中的异步编程
Jan 28 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+Mysql+jQuery实现动态展示信息
2011/10/08 PHP
php下获取http状态的实现代码
2014/05/09 PHP
PHP Post获取不到非表单数据的问题解决办法
2018/02/27 PHP
PHP操作Redis常用命令的实例详解
2020/12/23 PHP
去除链接虚线全面分析总结
2006/08/15 Javascript
Extjs实现进度条的两种便捷方式
2013/09/26 Javascript
jquery复选框多选赋值给文本框的方法
2015/01/27 Javascript
JS的数组迭代方法
2015/02/05 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
jQuery遍历json的方法(推荐)
2016/06/12 Javascript
js select实现省市区联动选择
2020/04/17 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
mpvue将vue项目转换为小程序
2018/09/30 Javascript
JS实现头条新闻的经典轮播图效果示例
2019/01/30 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
JavaScript/TypeScript 实现并发请求控制的示例代码
2021/01/18 Javascript
[43:24]VG vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python使用MONGODB入门实例
2015/05/11 Python
Python+django实现文件上传
2016/01/17 Python
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
聊聊Python中的pypy
2018/01/12 Python
Python基于dom操作xml数据的方法示例
2018/05/12 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
简述python&amp;pytorch 随机种子的实现
2020/10/07 Python
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
EJB的角色和三个对象
2015/12/31 面试题
平面网站制作专科生的自我评价分享
2013/12/11 职场文书
一份婚庆公司创业计划书
2014/01/11 职场文书
中专自我鉴定
2014/02/05 职场文书
公务员培的训心得体会
2014/09/01 职场文书
关于清明节的演讲稿
2014/09/13 职场文书
总经理司机岗位职责
2015/04/10 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript