如何区分节点套接字服务器/客户端数据包上的数据事件?
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);
});
在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);
});