在nodejs' net'中过快地发送消息

时间:2014-09-17 15:29:18

标签: javascript json node.js

我在2个nodejs服务器之间发送json消息使用'net'模块。

这一切都很好,但是如果我尝试发送彼此太近的2条消息,我会收到错误:

undefined:1
{"message":"wheelSpeed","data":{"left":0,"right":0}}{"message":"newPlayer","da
                                                    ^
SyntaxError: Unexpected token {
    at Object.parse (native)
    at Socket.<anonymous> (/home/pi/halloween/pi-node.js:128:32)
    at Socket.emit (events.js:95:17)
    at Socket.<anonymous> (_stream_readable.js:764:14)
    at Socket.emit (events.js:92:17)
    at emitReadable_ (_stream_readable.js:426:10)
    at emitReadable (_stream_readable.js:422:5)
    at readableAddChunk (_stream_readable.js:165:9)
    at Socket.Readable.push (_stream_readable.js:127:10)
    at TCP.onread (net.js:528:21)

失败的代码是:

var messageData = JSON.parse(rawData);

,周围的代码如下:

server.on('data', function(rawData) {

    console.log('From server', rawData);
    var messageData = JSON.parse(rawData);
    console.log('Remote server is talking to us', messageData);
    var data = messageData.data;

崩溃前调试的输出是:

From server <Buffer 7b 22 6d 65 73 73 61 67 65 22 3a 22 6d 6f 76 65 4c 61 75 6e 63 68 65 72 22 2c 22 64 61 74 61 22 3a 7b 22 78 22 3a 39 30 2c 22 79 22 3a 39 30 7d 7d>
Remote server is talking to us { message: 'moveLauncher', data: { x: 90, y: 90 } }
From server <Buffer 7b 22 6d 65 73 73 61 67 65 22 3a 22 77 68 65 65 6c 53 70 65 65 64 22 2c 22 64 61 74 61 22 3a 7b 22 6c 65 66 74 22 3a 30 2c 22 72 69 67 68 74 22 3a 30 7d ...>

undefined:1
{"message":"wheelSpeed","data":{"left":0,"right":0}}{"message":"newPlayer","da

看起来一条消息通过OK但接下来的两条消息失败了,因为它们似乎同时进入。

有没有办法表明一条消息的结束和下一条消息的开始?如果我在消息之间留出一段合理的时间,这似乎会自动发生在我身上。

1 个答案:

答案 0 :(得分:1)

您正在使用TCP协议,TCP协议用于发送字节流,因此没有“消息”概念或类似协议本身实现的概念

例如,这个:

socket.write("ABC");
socket.write("DEF");

可以到达:

  • “ABC”以及后来的“DEF”
  • “ABCDEF”,
  • “AB”以及后来的“CDEF”
  • 等等...

你能想象的任何组合,你都无法预测

你有两个很大的选择:

  1. 在TCP之上实现您自己的协议以满足您的需求
  2. 切换到其他协议
  3. 在TCP

    之上实施您自己的协议

    你需要根据自己的需要在TCP自定义上实现自己的协议,根据你的问题,你似乎需要某种“消息”分离,例如,你可以在你的协议上建立'\ n'是消息的分隔符。 您需要实现逻辑来连接碎片消息,直到找到包含多条消息的数据包的'\ n'和拆分逻辑(因为您无法控制/预测TCP上的碎片)。这就是 telnet 协议所做的事情(telnet和原始TCP 不是完全相同,因为我刚才解释过)

    切换到其他协议

    这是我个人更喜欢这样的情况的另一种选择,使用其他协议(优选通过HTTP),socket.io是我最喜欢的(http://socket.io/),任何协议都有利于解决这个问题这个问题只要它有节点的客户端/服务器库,它就满足您的所有需求