javascript - 在nodejs中发送消息太快 'net'

标签 javascript json node.js

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

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

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

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

有没有办法指示一条消息的结束和下一条消息的开始?如果我在消息之间留出合理的时间,这对我来说似乎会自动发生。

最佳答案

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

例如:

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

可能到达:

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

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

对此您有两个大选择:

  1. 在 TCP 之上实现您自己的协议(protocol)以满足您的需求
  2. 切换到另一个协议(protocol)

在 TCP 之上实现您自己的协议(protocol)

您需要在 TCP 自定义之上实现您自己的协议(protocol)来满足您的需求,根据您的问题,您似乎需要某种“消息”分离,例如,您可以在协议(protocol)上建立 '\n' 是消息的分隔符。 您将需要实现连接分段消息的逻辑,直到找到 '\n' 和具有多个消息的数据包的分割逻辑(因为您无法控制/预测 TCP 上的分段)。这就是 telnet 协议(protocol)的作用(telnet 和原始 TCP 完全相同,因为我刚刚解释过)

切换到另一个协议(protocol)

这是我个人在这种情况下更喜欢的另一种选择,使用另一种协议(protocol)(最好通过 HTTP),socket.io 是我最喜欢的协议(protocol)( http://socket.io/ ),任何协议(protocol)都可以很好地解决这个问题,只要因为它有用于 Node 的客户端/服务器库,并且它满足您的所有需求

关于javascript - 在nodejs中发送消息太快 'net',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25894648/

相关文章:

Javascript SVG 查看器库

javascript - 无法通过 Angular $resource 发布数据?

c# - 使用 Json.Net 反序列化时设置必填字段

javascript - 如何记录当前的css环境?

c# - SignalR 项目中的 Json 引用冲突

node.js - 为什么 Promise 在 .then 之后返回为 <Pending>?

javascript - 如何通过点击 JavaScript 中输入文本字段内的十字按钮来刷新我的实时搜索?

javascript - 防止 "bubbling"?

带有 socket.io 的 node.js 服务器同时处理 50000 个客户端

node.js 无需刷新即可获取新数据