【问题标题】:How to distinguish between node socket server / client packets on data event?如何区分数据事件上的节点套接字服务器/客户端数据包?
【发布时间】:2015-01-28 14:26:42
【问题描述】:

在node中,当你创建一个socket server并用client连接它时,write函数会触发data事件,但是好像没有办法区分流量的来源(除了添加您自己的 ID/标头到每个发送的缓冲区)。

比如这是server.write的输出“server say hello”,那么所有的“n个client msg”都是从client.write出来的,都在on('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!

有没有正确的方法来区分socket上数据的来源?

一个简单客户端的代码:

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

【问题讨论】:

    标签: node.js sockets tcp


    【解决方案1】:

    流量的来源是服务器。

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

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

    【讨论】:

    • 谢谢。这是有道理的,也是我所做的/怀疑的,但我担心我是否做了很多不必要的额外工作
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 2012-02-12
      • 1970-01-01
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      相关资源
      最近更新 更多