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 相关文章推荐
使用forever管理nodejs应用教程
Jun 03 NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 NodeJs
nodejs multer实现文件上传与下载
May 10 NodeJs
docker中编译nodejs并使用nginx启动
Jun 23 NodeJs
基于nodejs+express4.X实现文件下载的实例代码
Jul 13 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
nodejs更改项目端口号的方法
May 13 NodeJs
NodeJs实现简单的爬虫功能案例分析
Dec 05 NodeJs
NVM安装nodejs的方法实用步骤
Jan 16 NodeJs
详解nodejs http请求相关总结
Mar 31 NodeJs
通过Nodejs搭建网站简单实现注册登录流程
Jun 14 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 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
非洲第一个咖啡超凡杯大赛承办国—卢旺达的咖啡怎么样
2021/03/03 咖啡文化
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
2012/09/13 PHP
服务器迁移php版本不同可能诱发的问题
2015/12/22 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
PHP实现单条sql执行多个数据的insert语句方法
2019/10/11 PHP
jQuery 注意事项 与原因分析
2009/04/24 Javascript
js特殊字符转义介绍
2013/11/05 Javascript
js call方法详细介绍(js 的继承)
2013/11/18 Javascript
jQuery实现移动 和 渐变特效的点击事件
2015/02/26 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
2016/05/30 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
2019/05/10 Javascript
ionic2.0双击返回键退出应用
2019/09/17 Javascript
python中执行shell的两种方法总结
2017/01/10 Python
Python实现购物车程序
2018/04/16 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
Django后台admin的使用详解
2019/07/08 Python
Python编程中类与类的关系详解
2019/08/08 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
一篇文章搞懂python的转义字符及用法
2020/09/03 Python
class类在python中获取金融数据的实例方法
2020/12/10 Python
Django 实现图片上传和下载功能
2020/12/31 Python
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
高一政治教学反思
2014/01/28 职场文书
数学系个人求职信范文
2014/01/30 职场文书
《翻越远方的大山》教学反思
2014/04/13 职场文书
班干部演讲稿
2014/04/24 职场文书
我的小天地教学反思
2014/04/30 职场文书
学生会生活部工作总结2015
2015/03/31 职场文书
行政申诉状范文
2015/05/20 职场文书
刑事附带民事代理词
2015/05/25 职场文书
python 三边测量定位的实现代码
2021/04/22 Python
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
2022/03/13 MySQL