`
hiphunter921
  • 浏览: 68535 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

node读取tcp数据

阅读更多

看到nodejs提供了net module,可以发起tcp连接,于是想到了我们的multicastserver,可以用node去接受数据,然后通过websocket,来实时显示后台发送的socket数据。

 

有想法已经很久了,但是之前只是写到获取到了socket发送来的数据,但是解析数据这块有点问题,没有能很完整的解析所有数据。最近几天又开始写了,卡在了读取byte[]成一个double,纠结了2天,未果。。后来问了群里,才知道node本来就有个buffers模块,直接调用里面的方法就好,有从8位int到32位int和float,double的读取和写入。。。尼玛,早知道就省事多了。。我也想了。。node这种跑在后端的代码,怎么可能不能读取tcp发来的这种byte[]呢。。。

 

下面是自己写的一个读取short,int,long,String,double转date的工具类,node的buffer没直接读取64位int的。。所以我自己的getLong还是有点用。。。

 

 

var byteArrayUtil=(function() {
   	getShort=function(b,offset){
	  var value = 0;
	  for (var i = 0; i < 2; i++) {
	    var shift = i * 8;
	    value += (b[i + offset] & 0x000000FF) << shift;
	  }
	  return value;
	}
	getInt=function(b,offset){
	  var value = 0;
	  for (var i = 0; i < 4; i++) {
	    var shift = i * 8;
	    value += (b[i + offset] & 0x000000FF) << shift;
	  }
	  return value;
	}
	getLong=function(b,offset){
	  var value = 0;
	  for (var i = 0; i < 8; i++) {
	    var shift = i * 8;
	    value += (b[i + offset] & 0x000000FF) << shift;
	  }
	  return value;
	}
	getDouble=function(b,offset){
	  var value = 0;
	  for (var i = 0; i < 8; i++) {
	    var shift = i * 8;
	    value += (b[i + offset] & 0x000000FF) << shift;
	  }
	  return value;
	}
	getString=function(b,offset,length){
	  var value="";
	  for (var i = 0; i < length; i++) {
	    var c=b[offset+i];
	    if(c!=0){
	    	value+=String.fromCharCode(c);
	    }else{
	    	break;
	    }
	  }
	  return value;
	}
	doubleToDate=function(time){
		var date=new Date();
		date.setFullYear(1899);
		date.setMonth(11);
		date.setDate(30);
		date.setHours(0);
		date.setMinutes(0);
		date.setSeconds(0);
		date.setMilliseconds(0);

		var baseTime=date.getTime();
		baseTime+=Math.floor(time*24*60*60*1000);

   		date.setTime(baseTime);
   		return date;
	}
	return this;
})();

 

 

然后是接受到socket的data事件后的处理代码,只是写了最最简单的控制台打印,websocket的东西之后继续加上:

 

socket.on("data",function(data){
   var offset=5;
   var buffer=new Buffer(data);
   console.log("buffer length:"+buffer.length);
   var magiccode=buffer.readUInt16LE(offset);
   //console.log(magiccode.toString(16));
   if(magiccode.toString(16)=="abcd"){
     var size=buffer.readUInt32LE(data,offset+2);
     console.log("size:"+size);
     var type=buffer.readUInt16LE(offset+6);
     //console.log("type:"+type);
     if(type==13){
       var time=buffer.readDoubleLE(offset+8);
       //console.log("time:"+time+"  typeof():"+typeof(time)); //number
       var date=byteArrayUtil.doubleToDate(time);
       console.log(date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate()+" "+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds());
       var queue=byteArrayUtil.getString(data,offset+16,16);
       console.log("queue:"+queue);
       var totalAgent=byteArrayUtil.getLong(data,offset+32);
       console.log("totalAgent:"+totalAgent);
     }
   }  
});

 

 

有空还是要多看看node的文档。。只凭着自己瞎搞,效率太低了。。

 

在windows上装了node-0.6.11,安装真心简单,装好后cmd里就可以用node了。。。本来的cygwin里的是0.5.0的,调用buffer的read方法时候一直报typeerror,开始还纳闷,想了好久猜测也许是版本不对,老版本大概还没这方法,换了新的果然OK了。。爽~~

buffer.readDoubleLE(offset)好棒~~

分享到:
评论

相关推荐

    node_tcp_proxy:node实现tcp代理,本例主要是用来代理emq tcp服务器

    这个项目中的`node_tcp_proxy-master`文件可能包含了实现上述功能的完整代码,你可以进一步研究其源码以获取更深入的理解。通过这样的实践,你不仅可以学习到TCP代理的实现,还可以掌握Node.js处理网络连接和数据流...

    node-modbus-tcp:NodeJS Modbus TCPIP

    Modbus TCP / IP流 这是一个非常简单的模块,使用NodeJS Streams2读取Modbus TCP数据并将其转换为JSON,反之亦然。安装如果您只是开始或尝试使用该库,建议您尝试使用 。 它更完整(它支持所有标准功能代码),并且...

    远程采集华为逆变器使用modbus tcp协议进行通讯的设备数据.zip

    本案例中,我们将讨论如何使用Modbus TCP协议从华为逆变器远程采集设备数据。华为逆变器是太阳能发电系统中的重要组件,负责将太阳能电池板产生的直流电转换为交流电并入电网。通过Modbus TCP,我们可以实现对逆变器...

    java调用OPC获取点位数据

    Java调用OPC(OLE for Process Control)获取点位数据是一项常见的工业自动化任务,尤其在SCADA(Supervisory Control and Data Acquisition)系统中。OPC是微软平台上的一个标准接口,它允许不同厂商的软件应用程序...

    node-omron-fins-master.zip_FINS_cs3_fins node_omron_欧姆龙

    FINS是欧姆龙专为工业网络设计的一种通信协议,它允许设备间进行数据交换,包括读取和写入PLC的存储区、执行控制命令等。FINS协议支持多种网络拓扑,如环形、总线型和星型,并且具有高度的兼容性,可应用于不同型号...

    node.js实现后台连接socket套接字获取数据

    本篇文章将深入探讨如何使用Node.js和Socket.IO来实现后台连接并获取数据。 首先,我们要理解Socket.IO的工作原理。它是基于WebSocket协议的,但同时也支持其他几种 fallback 技术,如polling、long-polling等,...

    Node.js-NodeJs的TCP中的粘包分包问题的解决方案

    在Node.js中,TCP(传输控制协议)是一个底层网络接口,用于实现可靠的数据流传输。在TCP通信中,由于协议的特性,可能会出现“粘包”和“分包”的问题,这在处理实时性要求高的数据传输时尤为关键。本文将深入探讨...

    基于TCP传输的H264流解码和播放

    基于TCP传输的H264流解码,首先需要接收端通过TCP连接接收到H264编码的视频数据流。这些数据通常是以NAL单元(Network Abstraction Layer units)的形式,每个NAL单元包含一段完整的视频信息,如I帧、P帧或B帧。然后...

    node-tcp-socket:简单的 nodejs tcp 套接字服务器

    本篇文章将详细探讨如何使用Node.js创建一个简单的TCP套接字服务器,以此来实现客户端和服务器之间的数据交换。 标题中的"node-tcp-socket"指的是使用Node.js来实现TCP(传输控制协议)套接字。TCP是一种面向连接的...

    NodeMCU-小程序数据显示模板.rar

    通过编程,NodeMCU可以连接各种传感器,获取环境参数如温度、湿度、光照等,并将这些数据通过Wi-Fi发送到云端服务器。常用编程语言为Lua,但也可以通过Arduino IDE等工具使用C/C++进行开发。 其次,微信小程序是...

    s7-300的tcp/ip协议通讯

    这使得S7-300能够通过组态TCP连接以及使用开放式通信的功能块与其他设备建立TCP连接,实现数据交换。本文将详细介绍如何配置S7-300 CPU作为TCP客户端,与PC机上运行的TCP&UDP Debug软件模拟的服务器进行通信的过程。...

    modbus tcp通讯示例源码.rar

    例如,读取或写入的寄存器地址、数据值需要转换成16位的整数。 3. **Modbus功能码**:根据Modbus协议定义的功能码(如0x03用于读离散输入,0x06用于写单个保持寄存器)构建Modbus报文。 4. **报文构建**:构造包含...

    node-escpos-3_node打印机_Node.js_node-escpos_escnodejs_escpos_

    例如,你可以通过HTTP请求接收订单数据,然后使用"node-escpos"将订单信息转化为打印机可识别的格式并发送到打印机。 在开发过程中,"node-escpos"的API文档是必不可少的参考资料。它详细介绍了如何初始化打印机...

    深入Node TCP模块的理解

    此外,我们可以通过监听`data`事件来读取客户端发送的数据,通过设置`setEncoding`方法来指定数据编码。`socket.bytesRead`属性记录了累计接收的字节数。当客户端关闭连接时,会触发`end`事件,我们可以通过监听这个...

    node-TCP-Chat:使用纯节点 TCP API 实现图表服务器和客户端。 没有 Packages.json,没有 NPM,只有 Node!

    它利用 Node 的 Node 的 CLI API 来读取用户的输入。 聊天室 安装 克隆仓库。 使用node src/server.js启动服务器 使用node src/client.js启动客户端 CLI 应用程序( node src/client.js 键入每个客户

    8案例七:[视频流转 MP3 工具] - Node 数据流和管道 - Stream[pipe

    可写流是消费数据的,从可读流中获取数据,对拿到的 Buffer 数据进行处理消耗,把它写入目标对象。 duplex streams 也叫双工流,它既是可读流也是可写流,例如 Tcp socket 是可读可写的双工流。Transform streams ...

    Node.js学习之TCP/IP数据通讯(实例讲解)

    本文将深入讲解如何在Node.js中创建TCP服务器,并通过实例来演示TCP数据通讯的过程。 首先,创建TCP服务器的关键是使用`net.createServer()`函数。此函数接受一个可选的`options`对象和一个`connectionListener`回...

    nodemcu+dth11.rar

    3. **读取数据**:在代码中调用DHT11库的函数获取温度和湿度值。例如,`dht.read11(DHTPIN)`,其中DHTPIN是DHT11连接的GPIO引脚。 4. **网络通信**:利用ESP8266的WiFi功能,如`WiFiClient`库,建立TCP连接到服务器...

    Professional Node.js

    《Professional Node.js》一书深度探索了Node.js的高级应用,为读者提供了全面且深入...无论是初学者还是有经验的开发者,都能从中获取宝贵的知识,提升自己的编程技能,构建出更加稳定、高效和安全的Node.js应用程序。

    Node.js-node.js中文资料导航

    6. **流(Stream)**:Node.js 的流 API 允许数据以连续、高效的方式处理,尤其适用于处理大文件或网络传输,避免一次性加载大量数据导致内存溢出。 7. **Event Loop(事件循环)**:Node.js 的核心机制之一,它...

Global site tag (gtag.js) - Google Analytics