看到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. 优秀的Android资源

    今天,收藏了一下“优秀的Android资源”,以后有时间也学习学习. 一.开发工具 开发android第一步就是安装开发工具SDK,国内有一些机构和公司对些作了境像,这个网站作了详细统计列表:http ...

  2. VC++ 在Watch窗口显示GetLastError值以及详细信息

    You can display the value GetLastError() will return by putting "@err" in your watch windo ...

  3. centos 6.5 安装图形界面【转】

    最近想在centos 6.5上安装图形界面,在网上找到了方法.[原文链接] CentOS6相对于CentOS5的安装有了不少的进步,有不少默认的选项可以选择,如: Desktop :基本的桌面系统,包 ...

  4. 1.0_搭建PHP服务器环境的步骤

    a,下载安装一款静态web服务器,ex:HTTPD,IIS; b,下载安装PHP引擎: c,在静态服务器配置一下,声明PHP引擎的存在. 注意,以上三步可以用xampp套件来完成. 启动Apache, ...

  5. 关于TNS_ADMIN环境变量

    转自:https://blog.csdn.net/pan_tian/article/details/7699599 很多oracle产品都有自己的TNS文件,如果你的系统里装了多个Oracle的产品的 ...

  6. Mac中pico编辑器的使用方法

    Pico是一个由华盛顿大学(University of Washington)计算与通讯研究所(Computing and Communications Group)编写并维护的文本编辑程序,在多个版 ...

  7. Python之实现简单计算器功能

    一,需求分析 要求计算一串包含数字+-*/()的类似于3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4)表达式的数值 二,知识点 正 ...

  8. devmapper: Thin Pool has 162394 free data blocks which is less than minimum required 163840 free data blocks

    问题: 制作镜像的时候报错 devmapper: Thin Pool has 162394 free data blocks which is less than minimum required 1 ...

  9. What is Grammar?

    What is Grammar? And why grammar is your friend… Grammar(noun): the structure and system of a langua ...

  10. Powershell实现Telnet Port

    Telnet Port 脚本 $servers = get-content D:\ps\ServerIPAddress.TXT $portToCheck = '80' for($i=1;$i -le ...