将数据写入节点中的套接字

写入套接字时,我得到一个奇怪的结果。 我用一个客户端和一个服务器写了一个简单的实验:

server.js

var net = require('net'); net.createServer(function (connection) { connection.on('data', function (data) { console.log('data: ' + data); }); }).listen(1337); 

client.js

 var net = require('net'); var client = net.connect({port: 1337}, function () { var i = 0; function send() { client.write('a'); if (++i < 100) { process.nextTick(send); } else { client.end(); } } send(); }); 

我希望服务器显示100行data: a ,但是我最终得到的data: aaaaaaa更lessdata: aaaaaaa行。 有socket.setNoDelay()这似乎是我想要的,但似乎没有任何效果。

我错过了什么?

非常感谢,

TCP协议只发送您在套接字中写入的字节。 他们不会被分解成消息,这取决于你。 如果你想得到100行的话,你将不得不定义100个单独的消息,并为他们select一个分隔符。 通常人们通过\r\n分隔发送到TCP套接字的消息。

所以你需要改变你的服务器

 var net = require('net'); net.createServer(function (connection) { connection.on('data', function (buffer) { var data = buffer.toString(); if (data.indexOf('\r\n') > -1) { // If there's more than one line in the buffer var lines = data.split('\r\n'); // Split the lines var i = lines.length; while (i--) { // This will read your lines in reverse, be careful console.log(lines[i]); // Print each line } } else { console.log(data); // If only one line came through, print it } }); }).listen(1337); 

和你的客户

 var net = require('net'); var client = net.connect({port: 1337}, function () { var i = 0; function send() { client.write('a\r\n'); // Notice the \r\n part. This is what will help you separate messages on the server if (++i < 100) { process.nextTick(send); } else { client.end(); } } send(); }); 

然后我相信你会得到100行。

这个模块还提供了一个非常有趣的方法来做到这一点,当然, ZeroMQ也会因此而大放异彩,因为它已经有了一个很好的协议,可以将信息放入信封并发送出去。

也有趣的是,但是在你的问题的范围之外,你发送的信息写到一端的套接字将不会以相同的顺序到达服务器。 如果你改变你的发送function

  function send() { if (++i < 100) { client.write('a'+i+'\r\n'); process.nextTick(send); } else { client.end(); } } 

你可以看到他们不是按照你寄给他们的顺序来的。

通过“TCP协议只发送你写在套接字中的字节”我的意思是,如果你做socket.write("1"); socket.write("2") socket.write("1"); socket.write("2") ,您将在服务器上收到"12" ,因为这是您在套接字上写的。 你必须明确地将消息分开,以便服务器可以知道消息何时开始以及消息何时结束。

关于接收或不接收的东西,你会注意到,如果你删除process.nexTick,让你的客户像:

 var net = require('net'); var client = net.connect({port: 1337}, function () { var i = 100; while (i--) { client.write('a'+i+'\r\n'); } }); 

你会得到两个消息在服务器上(至less我得到):第一个数字83 – 99,然后0 – 82,尽pipe已经写了他们的顺序。

这是因为TCP以一种神奇的方式将它分成数据包。 第一个包实际上比第二个包大,所以它最后到达了那里。 你可以阅读更多关于TCP如何在维基百科页面上工作的内容, 这个video可能不仅仅是你需要听到的东西,而是很好地理解你正在使用的所有东西。