【问题标题】:How to send Data to the client with out client requesting the ws server in nodejs如何在没有客户端请求nodejs中的ws服务器的情况下向客户端发送数据
【发布时间】:2016-02-28 05:24:03
【问题描述】:

我需要将 csv 文件转换为 json 格式并将其发送到客户端,请求 nodejs 中的 ws 服务器,

文件会更新很多次,所以我需要将更新的数据发送给客户端

一旦数据完全加载,我就可以发送数据(比如当应用程序启动时,它会将文件中的所有数据发送到客户端)但是当我更新文件中的数据时,更新的数据正在控制台上打印出来,但不是发送给客户是他们在我的代码中的任何错误

我的 node.js 代码:

var ts = require('tail-stream');
var Converter = require("csvtojson").Converter;
var converter = new Converter({constructResult:false}); //for big csv data

var WebSocketServer = require('websocket').server;
var http = require('http');

var server = http.createServer(function(request, response) {
    // process HTTP request. Since we're writing just WebSockets server
    // we don't have to implement anything.
    response.write('hello');
    console.log('in http server \n');
});
server.listen(1337, function() { });

// create the server
wsServer = new WebSocketServer({
    httpServer: server
});

// WebSocket server
wsServer.on('request', function(request) {
   var connection = request.accept(null, request.origin);

    console.log('wsserver');
    connection.send('ws server');

    converter.on("record_parsed", function (jsonObj) {
   console.log(jsonObj); //here is your result json object
   connection.send(jsonObj);

});


var tstream = ts.createReadStream('log.csv', {
    beginAt: 0,
    onMove: 'follow',
    detectTruncate: false,
    onTruncate: 'end',
    endOnError: false
});


tstream.pipe(converter);
});

【问题讨论】:

    标签: json node.js web-services csv


    【解决方案1】:

    现在您正在创建一个新的读取流并在每个新连接上向转换器添加一个侦听器,一旦您有多个客户端(多次发出相同的事件等),这将导致麻烦。相反,您应该只保留一个阅读器并在有新记录时通知所有打开的连接。

    另外请注意,您使用的库仅接受 UTF-8 字符串或二进制类型消息,以您现在发送它们的方式发送的行对象将在 toString() 之后作为“[object Object]”字符串接收呼吁他们。您可能应该只发送行字符串或使用JSON.stringify / JSON.parse

    试试这个:

    var http            = require("http");
    var tailStream      = require("tail-stream");
    var Converter       = require("csvtojson").Converter;
    var WebSocketServer = require("websocket").server;
    
    var server    = http.createServer();
    var wsServer  = new WebSocketServer({ httpServer: server });
    var converter = new Converter({constructResult:false});
    var logStream = tailStream.createReadStream("log.csv", { detectTruncate : false });
    
    var connections = [];
    
    
    server.listen(1337);
    logStream.pipe(converter);
    
    
    //----------------------------------------------------
    converter.on("record_parsed", function (jsonObj) {
    
        connections.forEach(function(connection){
            connection.send(JSON.stringify(jsonObj));
        });
    });
    
    
    //----------------------------------------------------
    wsServer.on("request", function(request) {
    
       var connection = request.accept(null, request.origin);
    
       connection.on("close", function() {
            connections.splice(connections.indexOf(connection), 1);
        });
    
       connections.push(connection);
    });
    

    上面的代码可以运行,在客户端这样测试:

    var socket = new WebSocket('ws://localhost:1337/');
    
    socket.onmessage = function (event) {
      console.log(JSON.parse(event.data));
    }
    

    注意:这不会在开始时发送文件的全部内容,只是更新,但您可以轻松地实现存储记录并在新连接上发送它们。

    【讨论】:

    • 我们能否在没有新连接的情况下将更新的记录发送给已经连接的客户端
    • 我的主要问题是,只有在没有新连接或请求服务器的情况下,我们才能将更新的数据发送给客户
    • 是的,上面的代码就是这样做的。您保持套接字打开,不需要来自客户端的新连接或请求。
    • 它没有给我最后一条记录你知道原因吗
    猜你喜欢
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2015-06-15
    • 2013-08-13
    • 1970-01-01
    • 2014-11-03
    相关资源
    最近更新 更多