首頁  >  文章  >  web前端  >  nodejs結合socket.io實作websocket通訊功能

nodejs結合socket.io實作websocket通訊功能

小云云
小云云原創
2018-01-15 09:17:411726瀏覽

本文主要介紹了nodejs結合socket.io實現websocket通信功能的方法,結合實例形式分析了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(&#39;./data/trends.json&#39;,&#39;utf-8&#39;);#trends数据
  var coins = fs.readFileSync(&#39;./data/coins.json&#39;,&#39;utf-8&#39;);#coins数据
  #向所有socket连接发送数据
  for (i in iolist) {
    # 向客户端发送trends数据
    iolist[i].emit(&#39;trends&#39;, trends);
    # 向客户端发送coins数据
    iolist[i].emit(&#39;coins&#39;, coins);
  }
}, 1000);
# 服务器侦听在sockettest.com的3000端口上
http.listen(3000, function(){
  # 输出到标准输出
  console.log(&#39;listening on sockettest.com:3000&#39;);
});

新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(&#39;http://sockettest.com:3000&#39;);
    socketdata(socket);
    function socketdata() {
      #定义接收到coins类型数据时的行为
      socket.on(&#39;coins&#39;, function(msg){
        console.log(msg);
      }
      #定义接收到trends类型数据时的行为
      socket.on(&#39;trends&#39;, 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目錄下的兩個文件,可以看到寫入到文件的資料也會即時地推送到客戶端這裡來。

相關推薦:

Html5 中的WebSocket通訊

ThinkPHP結合ajax、Mysql實現的用戶端通訊功能碼範例

有關js頁間通訊方法storage事件的介紹

#

以上是nodejs結合socket.io實作websocket通訊功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn