我有一个套接字服务器在同一个端口上侦听所有类型的数据,如果数据是HTTP,那么我想解析它,否则我想用它来做其他事情......
net.createServer(function(socket){
if(/*socket contains HTTP data*/){
// parse it
}
else{
// do something else with the socket
}
}).listen(999)
我应如何解析套接字中的HTTP数据?
我已经开始为此目的编写自己的HTTP解析器,但我不想重新发明轮子,也许有更好的方法。
答案 0 :(得分:3)
在查看http.js的源代码后,我想出了以下方法来实现它......
var net = require('net'),
http = require('http'),
events = require('events');
var HTTPParser = process.binding('http_parser').HTTPParser;
function freeParser(parser){
if (parser) {
parser.onIncoming = null;
parser.socket = null;
http.parsers.free(parser);
parser = null;
}
};
function parse(socket){
var emitter = new events.EventEmitter();
var parser = http.parsers.alloc();
parser.reinitialize(HTTPParser.REQUEST);
parser.socket = socket;
parser.maxHeaderPairs = 2000;
parser.onIncoming = function(req){
emitter.emit('request', req);
};
socket.on('data', function(buffer){
var ret = parser.execute(buffer, 0, buffer.length);
if(ret instanceof Error){
emitter.emit('error');
freeParser(parser);
}
});
socket.once('close', function(){
freeParser(parser);
});
return emitter;
};
net.createServer(function(socket){
var parser = parse(socket);
parser.on('request', function(req){
// Got parsed HTTP object
});
parser.once('error', function(){
// Not HTTP data
});
}).listen(999);
答案 1 :(得分:1)
因此Node.JS核心库实际上通过套接字实现HTTP处理。该代码是用Javascript编写的,可见:https://github.com/joyent/node/blob/master/lib/http.js
这里面临的最大挑战是,我不清楚您是如何计划区分流量类型的?我的意思是你可以倾听" HTTP"在任何端口或套接字上,我们通常都同意80(和443 for https )。
但是不清楚你是如何监听对两个HTTP的调用并在同一个套接字中说出MySQL协议。你怎么知道哪些数据包属于哪种协议?我从来没有真正听说有人实施这样一个多功能的"在打开套接字之前,您通常知道期望的数据类型。否则你可能只是在收垃圾,对吧?