node.js 服务代理编程,练习使用connet做一个简单的服务代理示例:
/**
* Created by Administrator on 14-5-4.
*/
var http = require('http');
var net = require('net');
var url = require('url');
/**
* 说明:如何创建一个代理服务器
* @type {*}
*/
var proxy = http.createServer(function(req,res){
res.writeHead(200,{'Content-Type': 'text/plain'});
res.end('okay');
});
/**
* 说明:创建一个connect链接,并双向绑定管道
*/
proxy.on('connect',function(req,cltSocket,head){
var srvUrl = url.parse('http://' + req.url);
var srvSocket = net.connect(srvUrl.port,srvUrl.hostname,function(){
cltSocket.write('HTTP/1.1 200 Connection Established\r\n' +
'Proxy-agent: Node-Proxy\r\n' +
'\r\n');
srvSocket.write(head);
srvSocket.pipe(cltSocket);
cltSocket.pipe(srvSocket);
});
})
/**
* 现在运行代理
*/
proxy.listen(1337,'127.0.0.1',function(){
//创建一个隧道代理请求
var options = {
port:1337,
hostname:'127.0.0.1',
method:'CONNECT',
path:'www.google.com:80'
};
var req = http.request(options);
//只创建一个请求的链接,只需要返回一个request对象
req.end();
req.on('connect',function(req,socket,head){
console.log('got connected!');
socket.write('GET / HTTP/1.1\r\n' +
'Host: www.google.com:80\r\n' +
'Connection: close\r\n' +
'\r\n');
socket.on('data',function(chunk){
console.log(chunk.toString());
});
socket.on('end',function(chunk){
proxy.close();
});
});
});