需要使用 Socket io 解析 live json 文件

Posted

技术标签:

【中文标题】需要使用 Socket io 解析 live json 文件【英文标题】:Need to parse live json file using Socket io 【发布时间】:2015-09-04 12:56:06 【问题描述】:

首先请注意!我对 node.js 和 socket.io 的世界很陌生 我有一个包含以下数据的 json 文件,例如:-


"football": 

            "id": 1,
            "home": "Liverpool",
            "away": "Chelsea",
            "score": "1-0",
            "last scorer":"Gerrard"
             

此文件会在几秒钟内实时更新。

我真正想要实现的是解析这个 json 并在客户端将其更新为 html,此外我还想监听 json 文件中的任何更改并将其再次更新到 html 客户端。我怎样才能做到这一点,对不起,如果这个问题看起来很愚蠢,但任何建议都会有所帮助。

【问题讨论】:

为什么投反对票,至少给出理由??? 我的猜测是它被否决了,因为你问了一个问题“我该怎么做?”而不是“我试过了,但它不起作用;为什么它不起作用,我该如何解决?” 【参考方案1】:

我终于找到了一些东西,经过一些调整和研究其他答案,我终于制作了一个工作代码 首先简要回顾一下这段代码的作用 观看您的 json 文件(在本例中为 sports.json) 如果检测到更改,则仅读取 json 文件(在本例中为 sports.json) 然后将读取的 json 文件发送到连接的客户端

在客户端,只要您对 json 文件进行更改,魔法就会开始

PS:关于手动编辑和保存时 fs.watch 触发两次的讨论(我将尽快提出解决方法并在此处更新)

服务器端

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var jf = require('jsonfile'); //jsonfile module
var fs = require('fs'); //require file system

app.get('/', function(req, res) 
res.sendFile(__dirname + '/index.html');
);



io.sockets.on('connection', function(socket) 
fs.watch("sports.json", function(event, fileName)  //watching my        sports.json file for any changes
    //NOTE: fs.watch returns event twice on detecting change due to reason that editors fire 2 events --- there are workarounds for this on ***

    jf.readFile('sports.json', function(err, data)  //if change detected read the sports.json 

        var data = data; //store in a var
        console.log('sent') //just for debugging
        socket.volatile.emit('notification', data); //emit to all clients
    );

);

);

http.listen(3000, function()  //listen to 3000
console.log('listening on *:3000');
);

客户端:

<!doctype html>
<html>
  <head>
    <title>Socket.IO data</title>
<body>


<p id ="data">A data will appear here on change</p>

<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script>
    <script src="http://code.jquery.com/jquery-1.11.1.js"></script>
 <script>
       var socket = io.connect('http://localhost:3000'); //you can replace localhost with your public domain name too!!

    socket.on('notification', function (data) 

        $('#data').text(data.football.home); //Liverpool

    );

    </script>
</body>

sports.json 文件


"football": 

            "id": 1,
            "home": "Liverpool",
            "away": "Chelsea",
            "score": "1-0",
            "last scorer":"Gerrard"
             

【讨论】:

因为您对 SO 似乎很陌生:如果一个答案对您有帮助,即使它不是您自己的问题(我认为这与您所说的其他答案相关),这对您很有帮助支持该答案,以便用户知道它很有帮助。【参考方案2】:

(抱歉,我的回答不够详细,我遇到了电脑问题,很难做很多事情;解决问题后我会对其进行编辑,一切都不会崩溃)

要查找文件中的更改,请尝试以下操作:Monitor file change through AJAX, how? 或 Check if file has changed using HTML5 File API

服务器文件:

var EventEmitter = require('events').EventEmitter;
var footballWatcher = new EventEmitter();

io.on('connection', function (client) 

//
//Existing Code
//

//Node.js Event listener:
footballWatcher.on('update', function()
    io.emit('footballUpdate', footballData);
);

//Code to look for a change in the file, use this in it:
if(updated)
    footballWatcher.emit('update');        
);

客户端文件:

//
//Existing Code (connections, methods, emits and responses, etc.)
//

socket.on('football', function(footballJSONData)
    //JSON interpretation
);

【讨论】:

我假设您在使用 node.js 和 socket.io 部分时遇到了问题,正如您所说的那样,您是他们的新手,所以我会尝试在这些方面为您提供更多帮助. 我注意到你的文件监视想法并实现了我在其他地方找到的东西,谢谢你的帮助!!! 没问题,我希望一切顺利。如果其中一个人解决了您的问题,请务必选择您的问题的答案,以免其他人尝试解决已经解决的问题。

以上是关于需要使用 Socket io 解析 live json 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何实现socket.io的生存时间

使用 Socket.IO + Node.js + ZMQ 发送消息时发生内存泄漏

通过io.sockets.sockets解析时如何获取socket id

在 node.js 中构建 socket.io/express 应用程序时是不是需要 http?

Node JS、Socket.io、异步和阻塞事件循环

Socket.io聊天示例node.js需要