看到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. php判断今日是本月的第几个星期几

    php判断今日是本月的第几个星期几 php中有一个非常强悍的系统函数date()函数.巧妙的利用他可以实现显示任意我们需要的时间.比如今天遇到个需要是要判断今天是本月的第几个星期几,这里就不讨论这种说 ...

  2. EasyUI项目学习

    介绍easyui的使用,主要包括以下组件 布局面板 - layout 可伸缩面板 - accordion 选项卡 - tabs 控制面板 - panel 窗口 - window 对话框 - dialo ...

  3. java 关键字static

    在Java中static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰代码块. Java把内存分为栈内存和堆内存, 栈内存用来存放一些基本类型的变量.数组和对象的引用, 堆 ...

  4. 在 App Store 三年學到的 13 件事(下)

    博文转载至 http://blog.csdn.net/iunion/article/details/18959801     Steven Shen,曾經寫過一本書,也翻過一本書,開發 iOS app ...

  5. python数据类型及运算符

    python 的数据类型:数字.字符串.元组.列表.字典   type(a)  查看a的类型 数字: 整形int:-2 **32 ~+2**32 次方 长整形 a=123L 浮点float 复数型 - ...

  6. JZOJ.5231【NOIP2017模拟8.5】序列问题

    Description   Input 输入文件名为seq.in.首先输入n.接下来输入n个数,描述序列 A. Output 输出文件名为seq.out.输出一行一个整数代表答案.   Sample ...

  7. The Thinking of AutomaticTest(有关自动化测试的思考)

    考虑因素: 容易维护 简洁易懂 代码重用性好 系统的稳定性强 UI自动化:   数据的获取:装载的数据文件类型.数据的形式.数据的解析方法定义. 1.利用Junit单元测试组织用例,明确输入数据.预期 ...

  8. 18.android studio 安装ing

    1.首先得FQ,在谷歌中搜索android studio 2.安装时出现的问题. a. 解决方法,重启电脑,进入Bios,找到并将值设置为 :Intel Virtual Technology=Enab ...

  9. JS改变HTML元素的绝对坐标

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DT ...

  10. java连接elastic search 9300

    java连接elastic search 导入jar包:https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/_maven ...