首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当向Node.js tcp套接字发送多条消息时,它们将作为单个消息流。

问当向Node.js tcp套接字发送多条消息时,它们将作为单个消息流。
EN

Stack Overflow用户
提问于 2014-06-09 03:24:47
回答 2查看 15.3K关注 0票数 15

为了显示一个简单的示例,我希望向一个node.js tcp套接字发送多条消息。我只想在第一条消息完全发送/耗尽时发送第二条消息。但是,即使在等待调用写回调时,消息似乎也是作为一条消息发送的。

下面是一些示例代码:

代码语言:javascript
复制
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);
});

根据来自node.js的socket.write文档,“当数据最终被写入时,将执行可选的回调参数--这可能不会立即执行。”

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

但书面输出是:

在套接字上接收的数据: 第一条MessageSecond消息

我怎样才能让它单独发送这些信息?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-09 03:28:28

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

在您的示例中,当套接字层接受您的数据进行传输时,将调用回调。这并不意味着数据已经成功发送,甚至不意味着它已经离开了您的计算机。在回调中,您发送第二条消息,但是套接字层将第一条消息与第一条消息结合在一起,以提高效率,因为这对TCP并不重要。

票数 18
EN

Stack Overflow用户

发布于 2014-06-09 04:04:54

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

然后,您可以使用拆分流来分别读取客户机中的消息。

代码语言:javascript
复制
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);
});
票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24113273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档