如何区分节点套接字服务器/客户端数据包上的数据事件?

How to distinguish between node socket server / client packets on data event?

在node中,当你创建一个套接字服务器并与客户端连接时,write函数触发了data事件,但似乎无法区分来源流量(除了将您自己的 IDs/headers 添加到每个发送的缓冲区)。

例如,这是server.write的输出"server says hello",然后所有的"n client msg"都来自client.write,它们都在('data', fn):

➜  sockets  node client.js 
client connected to server!
client data: server says hello
client data: 1 client msg!
client data: 2 client msg!
client data: 3 client msg!
client data: 4 client msg!

有没有正确的方法来区分套接字上的数据来源?

简单客户端代码:

// client.js
var net = require('net');
var split = require('split');

var client = net.connect({
  port: 8124
}, function() {
  //'connect' listener
  console.log('client connected to server!');
  client.write('1 client msg!\r\n');
  client.write('2 client msg!\r\n');
  client.write('3 client msg!\r\n');
  client.write('4 client msg!\r\n');
});

client.on('end', function() {
  console.log('client disconnected from server');
});

var stream = client.pipe(split());
stream.on('data', function(data) {
  console.log("client data: " + data.toString());
});

和服务器代码

// server.js
var net = require('net');
var split = require('split');

var server = net.createServer(function(c) { //'connection' listener

    console.log('client connected');

    c.on('end', function() {
      console.log('client disconnected');
    });

    c.write('server says hello\r\n');

    c.pipe(c);

    var stream = c.pipe(split());

    stream.on('data', function(data) {
      console.log("client data: " + data.toString());
    });

});
server.listen(8124, function() { //'listening' listener
    console.log('server bound');
});

流量来源是服务器

如果您想知道服务器是否将数据回传给客户端,您将不得不提出自己的协议来表示这一点。

例如,服务器可以使用换行符分隔的 JSON 数据进行响应,该数据以特殊字节为前缀,指示它是回显还是 "original" 响应(或任何其他类型的 "type"你想要的价值)。然后客户端读入一行,检查第一个字节值以了解它是否是回显,然后 JSON.parse() 在第一个字节之后的其余行。

您可以通过以下方式区分每个客户: c.name = c.remoteAddress + ":" + c.remotePort;

c.on('data', function(data) {
   console.log('data ' + data + ' from ' + c.name);
});