将多个消息发送到Node.js tcp套接字时,它们将作为单个消息进行stream式传输

为了演示一个简单的例子,我想发送多个消息到一个node.js的tcp套接字。 我只想发送第二条消息时,第一条消息是完全发送/排水。 但是,即使在等待写入callback被调用时,这些消息似乎也是作为一个消息发送的。

这是一些示例代码:

var net = require('net'); var server = net.createServer(); server.on('connection', function(socket){ socket.write('First Message', function(){ socket.write('Second Message') }) }) var client = new net.Socket(); client.setEncoding('utf8'); server.listen(9999, function(){ client.connect(9999); }); client.on('data', function(data){ console.log('data received on socket:\n' + data); }); 

根据来自socket.write的node.js文档,“当数据最终被写出时,可选的callback参数将被执行 – 这可能不会立即生效。

基于此,在我的代码中,第二条消息应该只在数据最终写出第一条消息时发送。

但是书面的输出是:

在套接字上收到数据:

第一个MessageSecond消息

我怎样才能得到它分开发送这些消息?

TCP不会“单独”发送消息。 TCP是一个stream协议,这意味着当你向套接字写入字节的时候,你会在接收端获得相同的字节顺序。 没有任何类似的“消息边界”或“数据包”的概念。

在你的例子中,当套接字层接受你的数据传输时调用callback函数。 这并不意味着数据已经成功发送,甚至根本没有离开您的电脑。 在你的callback中,你发送了第二条消息,但是套接字层将它和第一条消息结合在一起以提高效率,因为这对TCP来说并不重要。

您需要为消息定义一个格式,以便您的客户端可以确定套接字stream中消息的开始和结束。 例如,你可以在你的例子中使用回车标记消息的结尾。

然后,您可以使用拆分stream在客户端分别读取消息。

 var net = require('net'); var split = require('split'); var server = net.createServer(); server.on('connection', function(socket){ socket.write('First Message\n', function(){ socket.write('Second Message\n') }) }) var client = new net.Socket(); client.setEncoding('utf8'); server.listen(9999, function(){ client.connect(9999); }); var stream = client.pipe(split()); stream.on('data',function(data){ console.log(data); });