看到node.js的httpServer和http.request,第一个想法居然是可以用它做一个代理服务器
下面代码,实现了代理的基本功能,通过网络的代理设置将你的浏览器的请求转到这个httpServer上,其接收到浏览器的http请求,转发到目的服务器,再将收到的数据转移到浏览器~~~就一二道贩子。

var _http = require('http'),
_util = require('util'),
//记录当前是第几个请求
number = 0;
 
_http.createServer(function(req, res){
number++;
res.number = number;
var headers = req.headers,
post = '',
url = req.url; //_url.parse(req.url, true)--解析url
console.log('\n======\n[' + number + ']--http--start--[' + req.method + ']' + url);
if(req.method == 'POST'){
//接收post
req.on('data', function(chunk){
post += chunk;
});
req.on('end', function(){
post = _querystring.parse(post);
httpRequest(res, headers, url, post);
});
}else{
httpRequest(res, headers, url);
}
}).listen(3333);
 
console.log('http server start at parth 3333\n\n\n');
 
/*
* 发送请求
*/
function httpRequest(mainRes, headers, url, post){
var host = headers.host;
host = host.split(':');
var options = {
host : host[0],
port : (host[1] ? host[1] : '80'),
path : url,
method : (post ? 'POST' : 'GET'),
headers : headers
};
//去掉gzip
delete options.headers['accept-encoding'];
console.log('[' + mainRes.number + ']----start http.request-- options:\n%s\n', _util.inspect(options));
 
var req_ = _http.request(options, function(res_){
var status_ = res_.statusCode,
headers_ = res_.headers,
data = '';
console.log('[' + mainRes.number + ']----export http.request-(' + status_ + ')-headers:%s',
_util.inspect(headers_));
 
//写header
mainRes.writeHead(status_, headers_);
 
var encoding = 'utf8';
//根据数据类型确定编码方式
if(headers_['content-type'] && (headers_['content-type'].indexOf('image') >= 0
|| headers_['content-type'].indexOf('application') >= 0
|| headers_['content-type'].indexOf('audio') >= 0
|| headers_['content-type'].indexOf('video') >= 0)){
encoding = 'binary';
}
res_.setEncoding(encoding);
//接收数据,转给原请求
res_.on('data', function(d){
console.log('data-------' + d.length);
var b = new Buffer(d, encoding);
mainRes.write(b, encoding);
});
res_.on('end', function(){
//请求结束
mainRes.end();
console.log('[' + mainRes.number + ']--------http.request---end----');
});
});
req_.on('error', function(e){
console.log([' + mainRes.number + '] + '----ERROR----problem with request: ' + e.message);
});
//发送post
if(post){
req_.write(_querystring.stringify(post));
}
req_.end();
}

当然,这段代码仅仅是学习目的的,并没有什么实际意义,https、gzip的问题都没解决,如果网站是gbk的,拿它访问也会乱码
如果要拿它翻墙,需要部署两个类似的服务,比如墙外A墙内B,将浏览器代理到B,由B将host隐藏起来,再转到A,A将隐藏的目的host恢复过来,再去访问最终的目的网站

用上面的目的试了试非死不可,不稳定,时不时的会出错~~等完善的再分享给大家

nodejs入门-做一个代理服务器的更多相关文章

  1. Fiddler实现手机抓包——小白入门 - 做一个不动声色的大人

    手机用fiddler抓包 电脑最好是笔记本,这样能和手机保持统一局域网内:其他不多说,直接说步骤了. 一.对PC(笔记本)参数进行配置    1. 配置fiddler允许监听到https(fiddle ...

  2. 用Nodejs做一个简单的小爬虫

    Nodejs将JavaScript语言带到了服务器端,作为js主力用户的前端们,因此获得了服务器端的开发能力,但除了用express搭建一个博客外,还有什么好玩的项目可以做呢?不如就做一个网络爬虫吧. ...

  3. TTS-零基础入门-10分钟教你做一个语音功能

    在本片博客正式開始之前,大家先跟我做一个简单的好玩的 小语音. 新建一个文本文档,然后再文档里输入这样 一句话  CreateObject("SAPI.SpVoice").Spea ...

  4. .Net Core 3.0后台使用httpclient请求网络网页和图片_使用Core3.0做一个简单的代理服务器

    目标:使用.net core最新的3.0版本,借助httpclient和本机的host域名代理,实现网络请求转发和内容获取,最终显示到目标客户端! 背景:本人在core领域是个新手,对core的使用不 ...

  5. Vue.js 入门:从零开始做一个极简 To-Do 应用

    Vue.js 入门:从零开始做一个极简 To-Do 应用 写作时间:2019-12-10版本信息:Vue.js 2.6.10官网文档:https://cn.vuejs.org/ 前言  学习 Vue ...

  6. 【 D3.js 入门系列 --- 5.1 】 做一个带坐标轴和标签的图表

    前面几节讲解了图标.坐标轴.比例等等,这一节整合这些内容做一个实用的图表.结果图如下: 代码如下所示: <html> <head> <meta charset=" ...

  7. 【 D3.js 入门系列 --- 3 】 做一个简单的图表!

    前面说了几节,都是对文字进行处理,这一节中将用 D3.js 做一个简单的柱形图. 做柱形图有很多种方法,比如用 HTML 的 div 标签,或用 svg . 推荐用 SVG 来做各种图形.SVG 意为 ...

  8. 【 D3.js 入门系列 — 3 】 做一个简单的图表!

    图1. 柱形图 1. 柱形图 前几章的例子,都是对文字进行处理.本章中将用 D3 做一个简单的柱形图.制作柱形图有很多种方法,比如用 HTML 的 <div> 标签,或在 SVG 上绘制 ...

  9. nodeJs入门篇之认识nodejs

    摘要:将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开 ...

随机推荐

  1. (转载)【C#4.0】dynamic和var及object

    dynamic a = 10;a = a + 10;Console.WriteLine(a.GetType()); 此段代码会输出 System.Int32,第二行不需要类型转换,因为在运行时识别类型 ...

  2. jQuery实现的浮动层div浏览器居中显示效果

    本文实例讲述了jQuery实现的浮动层div浏览器居中显示效果.分享给大家供大家参考,具体如下: 1.在页面的head中引入jQuery <script type="text/java ...

  3. C++ Base64编码解码、MD5及TEA加密解密

    Crypto.h以及Crypto.cpp Crypto.h  123456789101112131415161718192021222324252627282930313233343536373839 ...

  4. C# 各版本的新特性

    http://www.cnblogs.com/JeffreySun/archive/2012/11/14/2770211.html

  5. AWS系列-修改RDS时间(time_zone)

    1.1 需求 数据库时间和北京时间相差8小时 开发人员发现app的时间与国内时间相差12小时,需要修改RDS的time_zone参数 1.2 打开RDS参数组 1.3 创建新的参数组 由于默认的参数组 ...

  6. 解决百度地图Fragment切换黑屏问题

    https://blog.csdn.net/rentalphang/article/details/52076330 轻松解决啦!

  7. IOS开发之自定义键盘

     本文转载至 http://blog.csdn.net/majiakun1/article/details/41242069 实际开发过程中,会有自定义键盘的需求,比如,需要添加一个表情键盘.本文提供 ...

  8. JavaWeb项目(SSM)准备工作

    1.新建dynamic web project(Maven project也行) 我用的Eclipse + ssm + mysql 2.准备jar包 整合ssm的包1. springmvc: ...2 ...

  9. 《JAVA多线程编程核心技术》 笔记:第四章、Lock的使用

    一.使用ReentrantLock类1.1 ReentrantLock的使用:1.2 ReentrantLock的不足:1.3 正确使用Condition实现等待/通知1.4 使用多个Conditio ...

  10. shell输出颜色

    #!/bin/bash # #下面是字体输出颜色及终端格式控制 #字体色范围:- echo -e "\033[30m 黑色字 \033[0m" echo -e "\033 ...