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

时间:2015-01-28 14:26:42

标签: node.js sockets tcp

在节点中,当您创建套接字服务器并使用客户端连接它时,write函数会触发data事件,但似乎无法区分流量来源(除了将自己的ID /标题添加到每个发送的缓冲区之外)。

例如,这是输出"服务器说你好"来自server.write,然后是所有" n客户端消息"来自client.write,他们都出来了('数据',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');
});

2 个答案:

答案 0 :(得分:0)

流量来源是服务器。

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

例如,服务器可以使用换行符分隔的JSON数据进行响应,该数据以特殊字节为前缀,表示它是回声还是原始"响应(或任何其他类型的"类型"您想拥有的值)。然后客户端读入一行,检查第一个字节值以确定它是否为回声,然后JSON.parse()在第一个字节后面的其余部分。

答案 1 :(得分:0)

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

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