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

时间:2011-08-11 22:07:32

标签: node.js socket.io

我有一个基于java的服务器,允许客户端应用程序通过其他编程语言(java,unity,obj-c)连接。我想知道如何使用node.js和socket.io将javascript添加到此列表中。服务器侦听一个set端口并接受简单的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发送,并以little endian编码。源自Java的对象建模如下:

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

JSON将是:

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

2 个答案:

答案 0 :(得分:2)

您需要一个TCP套接字。将其连接到服务并侦听数据事件。触发数据事件时,请查看缓冲区长度。如果它是< = 4字节,你应该丢弃它*。否则使用readUInt32()指定'little'作为endianess读取前4个字节。然后使用此数字作为剩余缓冲区的长度。如果缓冲区短于给定长度,则仅“读取”剩余长度,否则“读取”给定长度。为此使用toString方法。您将获得一个可以使用JSON.parse方法解析的字符串,该方法将返回与JSON匹配的JavaScript对象。

通过实例化缓冲区并将所有数据写入其中,您可以基本相同的方式构建数据包。

有关详细信息,另请参阅Buffersnet文档。

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

答案 1 :(得分:1)

因此,如果您只想向服务器发送请求并获得响应,则可以执行此操作:

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);
});