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学习笔记之Connect中间件应用实例
Jan 27 NodeJs
nodejs中的fiber(纤程)库详解
Mar 24 NodeJs
解析NodeJs的调试方法
Dec 11 NodeJs
nodeJs链接Mysql做增删改查的简单操作
Feb 04 NodeJs
详解nodejs微信公众号开发——2.自动回复
Apr 10 NodeJs
详解nodeJS之二进制buffer对象
Jun 03 NodeJs
nodejs超出最大的调用栈错误问题
Dec 27 NodeJs
nodejs实现范围请求的实现代码
Oct 12 NodeJs
nodejs基础之多进程实例详解
Dec 27 NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 NodeJs
nodejs使用Sequelize框架操作数据库的实现
Oct 21 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.MVC的模板标签系统(二)
2006/09/05 PHP
PHP批量去除BOM头代码分享
2015/06/26 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
2016/01/22 PHP
phpstudy的php版本自由修改的方法
2017/10/18 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
2012/01/15 Javascript
js中复制行和删除行的操作实例
2013/06/25 Javascript
js实现鼠标点击左上角滑动菜单效果代码
2015/09/06 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
关于JavaScript作用域你想知道的一切
2016/02/04 Javascript
JSONP原理及简单实现
2016/06/08 Javascript
vuejs router history 配置到iis的方法
2018/09/20 Javascript
微信小程序实现点击图片放大预览
2019/10/21 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
vue中keep-alive内置组件缓存的实例代码
2020/04/16 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
Python中自定义函数的教程
2015/04/27 Python
Using Django with GAE Python 后台抓取多个网站的页面全文
2016/02/17 Python
python爬虫headers设置后无效的解决方法
2017/10/21 Python
python代码过长的换行方法
2018/07/19 Python
Django实现支付宝付款和微信支付的示例代码
2018/07/25 Python
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
2019/01/17 Python
python对文件目录的操作方法实例总结
2019/06/24 Python
Python实现使用dir获取类的方法列表
2019/12/24 Python
基于pygame实现童年掌机打砖块游戏
2020/02/25 Python
Python定义一个函数的方法
2020/06/15 Python
HTML5本地存储和本地数据库实例详解
2017/09/05 HTML / CSS
大韩航空官方网站:Korean Air
2017/10/25 全球购物
行政求职信
2014/07/04 职场文书
教研活动主持词
2015/07/03 职场文书
2016优秀护士先进个人事迹材料
2016/02/25 职场文书
golang 实用库gotable的具体使用
2021/07/01 Golang
html解决浏览器记住密码输入框的问题
2023/05/07 HTML / CSS