如何使用node.js创build自定义对象

我有一个基于Java的服务器,允许客户端应用程序通过其他编程语言(java,unity,obj-c)连接。 我想知道如何使用node.js和socket.io添加JavaScript到这个列表。 服务器在一个设置的端口上侦听,接受简单的JSON数据和一个以字节为单位的int长度,它的响应格式相同。 “数据包”的格式是这样的:

first four bytes are the length 00 00 00 1c remaining bytes are the data 7b 22 69 64 22 3a 31 2c 22 6e 61 6d 65 22 3a 22 73 6f 6d 65 77 69 64 67 65 74 22 7d 

数据通过TCP发送,并以小端编码。 源自Java的对象是这样build模的:

 public class Widget { private int id; private String name; public int getId() { return id; } public String getName() { return name; } } 

JSON将是:

 {"id":1,"name":"somewidget"} 

所以,如果你只是发送请求到服务器并得到回应,你可以这样做:

 var net = require('net'); var soc = net.Socket(); soc.connect(8088); soc.on('connect', function(){ var data, request, header; data = {request : true}; data = JSON.stringify(data); request = new Buffer(Buffer.byteLength(data)); request.write(data); header = new Buffer(4); header.write(request.length.toString()); // send request soc.end(header.toString('binary') + request.toString('binary')); }); soc.on('data', function(buffer){ // Crop length bytes var data = JSON.parse(buffer.slice(4).toString('utf-8')); soc.destroy(); console.log(data); }); 

您将需要一个TCP套接字。 将其连接到服务并监听数据事件。 当数据事件被触发看看缓冲区的长度。 如果它是<= 4字节,你应该丢弃它* 。 否则使用readUInt32()指定“little”作为endianess读取前4个字节。 然后使用这个数字作为剩余缓冲区的长度。 如果缓冲区比给定的长度短,只能“读取”剩余的长度,否则“读取”给定的长度。 使用toString方法。 您将得到一个可以使用JSON.parse方法parsing的string,该方法将返回与JSON匹配的JavaScript对象。

你可以通过实例化一个缓冲区并将所有的数据写入它来build立你的数据包。

有关详细信息,请参阅缓冲区和networking文档。

*我不知道节点何时触发数据事件,但是您的数据可能会被分段接收(即分成多个数据事件)。 这可能会发生,并且由于tcp协议的stream式性质,如果JSONstring足够长以致不适合单个帧,那么很可能会发生这种情况。 在这种情况下,你不应该简单地丢弃缓冲区,而是尝试重新组合碎片数据。