为了显示一个简单的例子,我想向node.js tcp socket发送多条消息。我只想在第一条消息完全发送/排出时发送第二条消息。但是,即使在等待调用写回调时,消息似乎也会作为一条消息发送。
以下是一些示例代码:
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文档,"当最终写出数据时,将执行可选的回调参数 - 这可能不会立即执行。"
基于此,在我的代码中,第二条消息只应在最终为第一条消息写出数据时发送。
但书面输出是:
在socket上收到的数据:
第一条MessageSecond消息
如何让它分别发送这些消息?
答案 0 :(得分:21)
您需要为邮件定义格式,以便客户端可以确定套接字流中邮件的开头和结尾。例如,您可以使用回车符来标记示例中的消息结尾。
然后,您可以使用拆分流在客户端中单独读取消息。
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);
});
答案 1 :(得分:15)
TCP不会“单独”发送消息。 TCP是 stream 协议,这意味着当您向套接字写入字节时,您在接收端以相同的顺序获得相同的字节。没有任何类似“消息边界”或“数据包”的概念。
在您的示例中,当套接字层接受您的数据进行传输时,将调用回调。 不意味着数据已成功发送,甚至已完全离开您的计算机。在回调中,您发送第二条消息,但套接字层将其与第一条消息相结合以提高效率,因为它与TCP无关。