`
hiphunter921
  • 浏览: 67205 次
  • 性别: 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-modbus-tcp:NodeJS Modbus TCPIP

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

    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 键入每个客户

    modbus tcp通讯示例源码.rar

    C# 开发的modbus tcp通讯示例源码,可通过tcp方式与modbus的各种硬件设备进行通讯。本源码为测试demo,可帮助不熟悉tcp通讯的开发人员快速了解并熟悉程序开发。

    node-net-keepalive:提供对节点js的套接字选项(如TCP_KEEPINTVL,TCP_KEEPCNT和TCP_USER_TIMEOUT)的高级访问

    :link: 净keepalive 使用模块的Node缺少的( TCP_KEEPINTVL和TCP_KEEPCNT ) SO_KEEPALIVE套接字选项设置程序和获取程序。 经过测试 :penguin: linux & :green_apple: osx ( amd64和arm64都应该) :smiling_face_...

    TCP_IP详解卷1

    第19章 TCP的交互数据流 200 19.1 引言 200 19.2 交互式输入 200 19.3 经受时延的确认 201 19.4 Nagle算法 203 19.4.1 关闭Nagle算法 204 19.4.2 一个例子 205 19.5 窗口大小通告 207 19.6 小结 208 第20章 TCP的成...

    VB通过Snap7控件与西门子PLC(S7-200SMART、1200、1500)进行TCP网络通讯(PLC侧无需编程)例程

    VB通过Snap7控件与西门子PLC(S7-200SMART、1200、1500)进行TCP/IP网络通讯例程,可读写VD,DB,M,IB,QB,TIMER,C类型数据。 西门子PLC的开源通信库,基于以太网(Ethernet)通信的Snap7系列通信库是一个相当不错的选择...

    TCP/IP详解part_2

    第19章 TCP的交互数据流 200 19.1 引言 200 19.2 交互式输入 200 19.3 经受时延的确认 201 19.4 Nagle算法 203 19.4.1 关闭Nagle算法 204 19.4.2 一个例子 205 19.5 窗口大小通告 207 19.6 小结 208 第20章 TCP的成...

    TCPIP详解--共三卷

    第19章 TCP的交互数据流 200 19.1 引言 200 19.2 交互式输入 200 19.3 经受时延的确认 201 19.4 Nagle算法 203 19.4.1 关闭Nagle算法 204 19.4.2 一个例子 205 19.5 窗口大小通告 207 19.6 小结 208 第20章 TCP的成...

    使用node.js中的Buffer类处理二进制数据的方法

    大家应该都知道在客户端JavaScript脚本代码中,...然而,在处理TCP流或文件流时,必须要处理二进制数据。因此,下面通过这篇文章来一起看看利用node.js中的Buffer类处理二进制数据的方法,有需要的朋友们可以参考借鉴。

    node-red-contrib-mcprotocol:一个红色节点,用于通过以太网上的MC协议与三菱PLC通信

    TCP和UDP连接都是可能的 可能有1E,3E和4E框架 适用于PLC类型 A (请参阅注释1) 质量保证 问 大号 [R ASCII和BINARY模式(请参见注释2) 推荐 如果您的PLC支持UDP + 4E,则这是最可靠的。 笔记 对于A系列PLC,仅...

    reach_ros_node.zip

    利用python读取nema0183标准协议的GPS数据并通过ROS节点发布出来,使用串口读取重点研究nmea_serial_start.py这个文件,也可以使用TCP/IP进行读取,需要这自己研究吧,也不知道在哪弄得代码了,反正我试过,可用

    大型ZIPs文件查看node-stream-zip.zip

    特性:从不加载完整的归档到内存,一切都是通过块读取大型归档支持所有操作都是非阻塞,非同步 i/o快速初始化无依赖,无二进制组件内置 zlib 模块解压deflate, deflate64, sfx, macosx/windows 内置归档ZIP64 支持...

    Node.js中的缓冲与流模块详细介绍

     – 通过TCP连接发送和接收数据;  – 从图像或者压缩文件读取二进制数据;  – 从文件系统读写数据;  – 处理来自网络的二进制数据流 而Buffer模块为Node.js带来了一种存储原始数据的方法,于是可以再js的上...

    esp8266_dht11_nodemcu:esp8266 和 DHT11 温湿度传感器的 Nodemcu 脚本

    esp8266_dht11_nodemcu esp8266 和 DHT11 温湿度传感器的 Nodemcu 脚本该项目包含: 一个简单的脚本“temp.lua”,它使用 esp8266 的 DHTxx 库和来自 Javier Yanez 的 nodemcu,从 DHT11 温度和湿度传感器读取数据。...

    node-drivers:node.js 中的工业协议驱动程序

    安装npm install node-drivers例子从 Logix5000 处理器读取和列出标签: const { TCP , CIP } = require ( 'node-drivers' ) ;const tcpLayer = new TCP ( '1.2.3.4' ) ;const logix5000 = new CIP . Logix5000 ( ...

    node-throttled-reader:通过限制对源流的读取,Node.js可读流限制了平均数据速率

    用例示例:与其他使用缓冲的调节器模块不同,它可以用于有效地调节传入的TCP流,这也会影响连接的另一端,因为内部Node和OS缓冲区将拥塞。 准确度可以在&lt;1%到25%以上的范围内,具体取决于速率和来源类型。 ...

    Node.js创建Web、TCP服务器

    Web服务器的功能: ... ... 做出响应(返回页面、文件、各类数据等) 常见的Web服务器架构: ...请求文件:包括静态文件(网页、图片、前端JavaScript文件、css文件…),及由...完成特定的操作:如登录、获取特定数据等 No

    详解nodeJS之二进制buffer对象

    在ES6引入TypedArray之前,JavaScript语言没有读取或操作二进制数据流的机制。Buffer类被引入作为Nodejs的API的一部分,使其可以在TCP流和文件系统操作等场景中处理二进制数据流。现在TypedArray已经被添加进ES6中,...

    node.js 利用流实现读写同步,边读边写的方法

    如下所示: //10个数 10个字节,每次读4b,写1b let fs=require(fs); function pipe(source,target... //监听读取文件完毕后,关闭读取rs.on('end') let rs=fs.createReadStream(source,{highWaterMark:4}); let ws=f

    node-connect-dubbo-test:Node.js通过Dubbo协议连接到Java服务器

    node 发起 dubbo 协议的 tcp 连接, 获取调用结果, 完成 rpc 调用 node 连接 zookeeper 使用 node 连接 zookeeper 注册中心, 并实现对注册中心上的目录的增删改查. 从 dubbo 的具体场景来说, 从注册中心获取到所有的...

Global site tag (gtag.js) - Google Analytics