热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解析TCPJSONStream并通过Socket.io发出每个对象-ParseTCPJSONStreamandemiteachobjectviaSocket.io

IamworkingwithadatafeedthatsendsaJSONstreamoveraTCPsocketandImusingnode.jssocke

I am working with a data feed that sends a JSON stream over a TCP socket and I'm using node.js/socket.io to emit the stream to a browser client.

我正在使用通过TCP套接字发送JSON流的数据馈送,我正在使用node.js / socket.io将流发送到浏览器客户端。

Everything is working except I need each JSON object to emitted as a separate message from the socket.io server. In the client the messages are received like this:

一切正常,但我需要将每个JSON对象作为来自socket.io服务器的单独消息发出。在客户端中,收到的消息如下:

//Message 1:
{"type":"TYPE_1","odds":[{"eventId":"foo","odds":[{"oddId":foo,"oddType":"LIVE","source":"foo"}]}]}
//Message 2:
{"type":"TYPE_2","odds":[{"eventId":"foo","odds":[{"oddId":foo,"oddType":"LIVE","source":"foo"}]}]}
{"type":"TYPE_3","odds":[{"eventId":"foo","odds":[{"oddId":foo,"oddType":"LIVE","source":"foo"}]}]}
//Message 3:
{"type":"TYPE_4","odds":[{"eventId":"foo","od
//Message 4:
ds":[{"oddId":foo,"oddType":"LIVE","source":"foo"}]}]}

The data feed docs state: "All messages sending to your application will form a JSON stream (no delimiter between messages), so you may need a decoder that support JSON stream."

数据馈送文档声明:“发送到您的应用程序的所有消息将形成JSON流(消息之间没有分隔符),因此您可能需要一个支持JSON流的解码器。”

So the stream is strictly correct but I need each object as separate message.

所以流是严格正确的,但我需要每个对象作为单独的消息。

I have looked at https://www.npmjs.com/package/JSONStream and others but am very new to nodejs and socketio and am not sure how to implement them in to the server.

我查看了https://www.npmjs.com/package/JSONStream和其他人,但对nodejs和socketio来说是一个新手,我不知道如何将它们实现到服务器中。

Have also read How can I parse the first JSON object on a stream in JS, nodejs JSON.parse(data_from_TCP_socket), http://www.sebastianseilund.com/json-socket-sending-json-over-tcp-in-node.js-using-sockets.

还阅读了如何在JS中解析流上的第一个JSON对象,nodejs JSON.parse(data_from_TCP_socket),http://www.sebastianseilund.com/json-socket-sending-json-over-tcp-in-node .js文件,使用的套接字。

I think it's something to do with buffer chunk lengths and them being too big so the messages get split but that could be wrong! I'm guessing I need a delimiter check that balances brackets but not sure how to go about it or if the right approach.

我认为这与缓冲区块长度有关,而且它们太大,所以消息会被拆分,但这可能是错误的!我猜我需要一个分隔符检查来平衡括号,但不知道如何去做或如果正确的方法。

My Server Script:

我的服务器脚本:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var net = require('net');
var port = 8992;              // Datafeed port
var host = '127.0.0.1';      // Datafeed IP address

//Whenever someone connects this gets executed
io.on('connection', function(socket){
  console.log('A user connected to me the server');

  //Whenever someone disconnects this piece of code executed
  socket.on('disconnect', function () {
    console.log('A user disconnected');
  });
});

//Create a TCP socket to read data from datafeed
var socket = net.createConnection(port, host);

socket.on('error', function(error) {
  console.log("Error Connecting");
});

socket.on('connect', function(connect) {
  console.log('connection established');
  socket.write('{"type":"SUBSCRIBE"}');
});

socket.on('data', function(data) {
  //console.log('DATA ' + socket.remoteAddress + ': ' + data);
  var data = data.toString();
  io.sockets.emit('event', JSON.stringify(data));
});

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

My Client:



  
  
  
  
  
    
      
    
    

    Any help or guidance would be amazing as really struggling with this.

    任何帮助或指导都会令人惊讶,因为真的在努力解决这个问题。

    1 个解决方案

    #1


    1  

    A common delimiter to use is a newline character (\n). If you have that appended to your JSON messages it will be very easy to parse the messages. For example:

    要使用的常用分隔符是换行符(\ n)。如果您在JSON消息中附加了该消息,则解析消息将非常容易。例如:

    var sockBuf = '';
    socket.setEncoding('utf8');
    socket.on('data', function(data) {
      sockBuf += data;
      var i;
      var l = 0;
      while ((i = sockBuf.indexOf('\n', l)) !== -1) {
        io.sockets.emit('event', sockBuf.slice(l, i));
        l = i + 1;
      }
      if (l)
        sockBuf = sockBuf.slice(l);
    });
    

    or a more efficient, but slightly less simple solution:

    或者更有效但稍微不那么简单的解决方案:

    var sockBuf = '';
    socket.setEncoding('utf8');
    socket.on('data', function(data) {
      var i = data.indexOf('\n');
      if (i === -1) {
        sockBuf += data;
        return;
      }
      io.sockets.emit('event', sockBuf + data.slice(0, i));
      var l = i + 1;
      while ((i = data.indexOf('\n', l)) !== -1) {
        io.sockets.emit('event', data.slice(l, i));
        l = i + 1;
      }
      sockBuf = data.slice(l);
    });
    

    推荐阅读
    • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
    • Windows下配置PHP5.6的方法及注意事项
      本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
    • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
    • Node.js学习笔记(一)package.json及cnpm
      本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
    • 向QTextEdit拖放文件的方法及实现步骤
      本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
    • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
    • Centos7.6安装Gitlab教程及注意事项
      本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
    • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
      本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
    • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
    • 《数据结构》学习笔记3——串匹配算法性能评估
      本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
    • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
      本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
    • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
    • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
      本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
    • Go Cobra命令行工具入门教程
      本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
    • Windows 7 部署工具DISM学习(二)添加补丁的步骤详解
      本文详细介绍了在Windows 7系统中使用部署工具DISM添加补丁的步骤。首先需要将光驱中的安装文件复制到指定文件夹,并进行挂载。然后将需要的MSU补丁解压并集成到系统中。文章给出了具体的命令和操作步骤,帮助读者完成补丁的添加过程。 ... [详细]
    author-avatar
    Hongquan_Yang
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有