Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向Node.js tcp套接字发送多条消息时,它们将作为一条消息流传输_Node.js_Sockets_Tcp - Fatal编程技术网

向Node.js tcp套接字发送多条消息时,它们将作为一条消息流传输

向Node.js tcp套接字发送多条消息时,它们将作为一条消息流传输,node.js,sockets,tcp,Node.js,Sockets,Tcp,为了展示一个简单的示例,我想向node.js tcp套接字发送多条消息。我只想在第一条消息完全发送/耗尽时发送第二条消息。但是,即使在等待调用write回调时,这些消息似乎也是作为一条消息发送的 以下是一些示例代码: var net = require('net'); var server = net.createServer(); server.on('connection', function(socket){ socket.write('First Message', functi

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

以下是一些示例代码:

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文档,“当数据最终被写入时,将执行可选的回调参数-这可能不会立即执行。”

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

但书面输出是:

在套接字上接收的数据:

第一条消息第二条消息


如何让它单独发送这些消息?

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


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

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

然后,您可以使用分割流在客户端中单独读取消息

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

值得注意的是,如果您同时在客户端和服务器上响应事件/发送数据包,则需要在客户端和服务器上进行拆分。很好的例子!这是正确的。然而,为了完整起见,您可能还想了解TCP的Nagle算法(请参阅),该算法出于性能原因将小的写入分为大的写入。您可以使用socket.setNoDelay()在节点中禁用此功能。你不应该依赖它来划定消息边界,部分原因是你无法判断某个“智能”网络设备是否会在你的上游执行此操作。@JoeHildebrand:是的,我知道唠叨。这就是为什么TCP连接应该被视为字节流而不是有边界的消息的主要原因。对不起,在我太快按enter键后,该评论被匆忙编辑了。我的意思不是说你不知道Nagle,但后来来的人可能会觉得setNoDelay很有趣——为了强调这一点,即使他们觉得它很有趣,也无助于他们。:)@乔伊尔德布兰德:事实上,这是提醒人们注意的一个很好的观点。谢谢