用户在哪些情况下是需要设置网络代理呢?

1. 内网上不了外网,需要连接能上外网的内网电脑做代理,就能上外网;多个电脑共享上外网,就要用代理; 
2.有些网页被封,通过国外的代理就能看到这被封的网站;
3.想隐藏真实IP;

4. 想加快访问网站速度,在网络出现拥挤或故障时,可通过代理服务器访问目的网站。比如A要访问C网站,但A到C网络出现问题,可以通过绕道,假设B是代理服务器,A可通过B, 再由B到C。

我们app的大多数用户情况是第一种.我们参考qq和chrome的插件switchysharp设置代理的方式来设计的界面

我们的项目是基于node-webkit技术进行开发的。

对于浏览器直接发送的请求设置代理可以直接设置chrome.proxy

                 if (proxy.proxyType == 0) {//不使用代理
chrome.proxy.settings.set({ 'value': { 'mode': 'direct' } }, function (e) { console.log(e) });
} else if (proxy.proxyType == 1) {//使用http代理
chrome.proxy.settings.set({ 'value': { 'mode': 'fixed_servers', rules: { singleProxy: { scheme: 'http', host: proxy.host, port: proxy.port }, bypassList: null } } }, function (e) { console.log(e) });
} else if (proxy.proxyType == 2) {//使用socks代理,可以支持版本4或者5
chrome.proxy.settings.set({ 'value': { 'mode': 'fixed_servers', rules: { singleProxy: { scheme: 'socks' + proxy.ver, host: proxy.host, port: proxy.port }, bypassList: null } } }, function (e) { console.log(e) });
} else if (proxy.proxyType == 3) {//使用系统代理
chrome.proxy.settings.set({ 'value': { 'mode': 'system' } }, function (e) { console.log(e) });

而程序内部使用nodejs发送的请求需要在发送请求时通过option进行配置,才能走代理网络

          var options = {
hostname: Common.Config.addrInfo.openApi,
path: '/api/Author/Article/Collected?skip=' + skip + ' & rows=' + this.pageSize,
method : "GET";
headers: {
'Accept' : "application/json",
'Authorization': 'Bearer ' + index.userInfo.token
}
}; var req = require('http').request(HttpUtil.setProxy(options), function (res) {
var err = HttpUtil.resStatus(options, res);
clearTimeout(timeoutEventId);
if (err) {
callback(err);
return;
}
var resData = [];
res.setEncoding('utf8');
res.on('data', function (chunk) {
resData.push(chunk);
}).on("end", function () {
callback(null, resData.join(""));
});
});
req.on('error', function (e) {
clearTimeout(timeoutEventId);
callback(HttpUtil.reqStatus(options, e));
req.end();
});
req.on('timeout', function (e) {
clearTimeout(timeoutEventId);
callback(HttpUtil.reqStatus(options, e));
});
req.end();
}
static setProxy(options) {//设置代理信息
if (this.proxy) {
if (this.proxy.proxyType == 1 || (this.proxy.proxyType == 3 && this.proxy.host && this.proxy.sysProxyType == "PROXY")) {
options.path = "http://" + options.hostname + options.path;
options.hostname = null;
options.host = this.proxy.host;
options.port = this.proxy.port;
} else if (this.proxy.proxyType == 2 || (this.proxy.proxyType == 3 && this.proxy.host && this.proxy.sysProxyType == "SOCKS")) {
try {
if (!this.SocksProxyAgent)
this.SocksProxyAgent = require('socks-proxy-agent');//引用socks代理配置模块
} catch (e) {
this.SocksProxyAgent = null;
}
if (this.SocksProxyAgent) {
var agent = new this.SocksProxyAgent("socks" + this.proxy.ver + "://" + this.proxy.host + ":" + this.proxy.port);
options.agent = agent;
}
}
}
return options;
}

但是经过实践证明这个方法解决不了很多网络代理用户请求我们服务器接口失败的问题。

我们又找到了request模块,经过在有问题的电脑上进行测试这个模块是可以访问成功的。

          var options1 = {
url: 'http://openapi.axeslide.com/api/TemplateTypes',
proxy: "http://10.22.138.21:8080",
headers: {
'User-Agent': 'request',
'Authorization': 'Bearer ' + index.userInfo.token,
'Accept' :"application/json"
}
};
this.request.get(options1, function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(response,body,"ok")
} else {
console.log(response,error, "err")
}
})

但是不管是之前的方式还是现在的request模板,在使用socks代理时,接收的数据量超过一定值时返回就会出现问题,然后把之前的socks-proxy-agent

又换了socks5-http-client做测试解决了该问题。

现在说一下测试工具,fiddler和node搭建的socks代理服务器

fiddler相信对大家来对并不陌生,先打开fiddler options选项,然后配置下代理信息,主要是端口号,这里可以设置是否设置成系统代理,设置之后需要重新启动fiddler,如果浏览器配置成走9999 所有的请求fiddler都会抓取到。

搭建socks代理可以从网上找现成的代码,node搭建的。大家也可以下载 http://files.cnblogs.com/files/fangsmile/socks5.zip ,下载后运行node proxy

下面附一段switchysharp的实现代码:

 ProxyPlugin.setProxy = function (proxyMode, proxyString, proxyExceptions, proxyConfigUrl) {
if (ProxyPlugin.disabled) return 0;
var config;
ProxyPlugin.proxyMode = Settings.setValue('proxyMode', proxyMode);
ProxyPlugin.proxyServer = Settings.setValue('proxyServer', proxyString);
ProxyPlugin.proxyExceptions = Settings.setValue('proxyExceptions', proxyExceptions);
ProxyPlugin.proxyConfigUrl = Settings.setValue('proxyConfigUrl', proxyConfigUrl);
switch (proxyMode) {
case 'system':
config = {mode:"system"};
break;
case 'direct':
config = {mode:"direct"};
break;
case 'manual':
var tmpbypassList = [];
var proxyExceptionsList = ProxyPlugin.proxyExceptions.split(';');
var proxyExceptionListLength = proxyExceptionsList.length;
for (var i = 0; i < proxyExceptionListLength; i++) {
tmpbypassList.push(proxyExceptionsList[i].trim())
}
proxyExceptionsList = null;
var profile = ProfileManager.parseProxyString(proxyString);
if (profile.useSameProxy) {
config = {
mode:"fixed_servers",
rules:{
singleProxy:ProxyPlugin._parseProxy(profile.proxyHttp),
bypassList:tmpbypassList
}
};
}
else {
var socksProxyString;
if (profile.proxySocks && !profile.proxyHttp && !profile.proxyFtp && !profile.proxyHttps) {
socksProxyString = profile.socksVersion == 4 ? 'socks=' + profile.proxySocks : 'socks5=' + profile.proxySocks;
config = {
mode:"fixed_servers",
rules:{
singleProxy:ProxyPlugin._parseProxy(socksProxyString),
bypassList:tmpbypassList
}
} }
else {
config = {
mode:"fixed_servers",
rules:{
bypassList:tmpbypassList
}
};
if (profile.proxySocks) {
socksProxyString = profile.socksVersion == 4 ? 'socks=' + profile.proxySocks : 'socks5=' + profile.proxySocks;
config.rules.fallbackProxy = ProxyPlugin._parseProxy(socksProxyString);
}
if (profile.proxyHttp)
config.rules.proxyForHttp = ProxyPlugin._parseProxy(profile.proxyHttp);
if (profile.proxyFtp)
config.rules.proxyForFtp = ProxyPlugin._parseProxy(profile.proxyFtp);
if (profile.proxyHttps)
config.rules.proxyForHttps = ProxyPlugin._parseProxy(profile.proxyHttps);
}
}
tmpbypassList = null;
break;
case 'auto':
if (ProxyPlugin.proxyConfigUrl == memoryPath) {
config = {
mode:"pac_script",
pacScript:{
data:Settings.getValue('pacScriptData', '')
}
};
Settings.setValue('pacScriptData', '');
}
else {
config = {
mode:"pac_script",
pacScript:{
url:ProxyPlugin.proxyConfigUrl
}
}
}
break;
}
ProxyPlugin.mute = true;
ProxyPlugin._proxy.settings.set({'value':config}, function () {
ProxyPlugin.mute = false;
if (ProxyPlugin.setProxyCallback != undefined) {
ProxyPlugin.setProxyCallback();
ProxyPlugin.setProxyCallback = undefined;
}
});
profile = null;
config = null;
return 0;
};

实现代理设置proxy的更多相关文章

  1. C#程序中设置全局代理(Global Proxy)

    1. HttpWebRequest类的Proxy属性,只要设置了该属性就能够使用代理了,如下: 1             //设置代理 2         WebProxy WP = new Web ...

  2. [Z] C#程序中设置全局代理(Global Proxy)

    https://www.cnblogs.com/Javi/p/7274268.html 1. HttpWebRequest类的Proxy属性,只要设置了该属性就能够使用代理了,如下: 1        ...

  3. 中小研发团队架构实践之生产环境诊断工具WinDbg 三分钟学会.NET微服务之Polly 使用.Net Core+IView+Vue集成上传图片功能 Fiddler原理~知多少? ABP框架(asp.net core 2.X+Vue)模板项目学习之路(一) C#程序中设置全局代理(Global Proxy) WCF 4.0 使用说明 如何在IIS上发布,并能正常访问

    中小研发团队架构实践之生产环境诊断工具WinDbg 生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器.调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具 ...

  4. JAVA HTTP请求 常用的代理设置

    由于公司上网实行代理机制, 而最近一段时间又在研究Web上的OpenApi. 没办法一定要使用代理,我之前有文章介绍了httpclient的代理使用方式, 这里介绍基本java的代理使用方式. 最常使 ...

  5. Django如何设置proxy

    设置porxy的原因 一般情况下我们代理设置是针对与浏览器而言,通常只需在浏览器设置中进行配置,但它只针对浏览器有效,对我们自己编写的程序并任何效果,这时就需要我们在软件编码中加入代理设置. --- ...

  6. git 代理设置

    git 代理设置: git config --global http.proxy http://proxy.com:8080git config --global https.proxy http:/ ...

  7. HttpURLConnection中使用代理(Proxy)及其验证(Authentication)

    HttpURLConnection中使用代理(Proxy)及其验证(Authentication) 使用Java的HttpURLConnection类可以实现HttpClient的功能,而不需要依赖任 ...

  8. 接口测试——HttpClient工具的https请求、代理设置、请求头设置、获取状态码和响应头

    目录 https请求 代理设置 请求头设置 获取状态码 接收响应头 https请求 https协议(Secure Hypertext Transfer Protocol) : 安全超文本传输协议, H ...

  9. nodejs爬虫笔记(二)---代理设置

    node爬虫代理设置 最近想爬取YouTube上面的视频信息,利用nodejs爬虫笔记(一)的方法,代码和错误如下 var request = require('request'); var chee ...

随机推荐

  1. const指针

    const指针这个问题,复习了好多次,每次看书的时候明白,但是过了一段时间之后没用,总会再次被搞糊涂. 那么今天就把这个问题先用代码实现,把自己理解的写下来.代码在下面: ; ; const int* ...

  2. spring:如何用代码动态向容器中添加或移除Bean ?

    先来看一张类图: 有一个业务接口IFoo,提供了二个实现类:FooA及FooB,默认情况下,FooA使用@Component由Spring自动装配,如果出于某种原因,在运行时需要将IFoo的实现,则F ...

  3. jquery设置元素的readonly与diabled属性方法

    cppy from : http://www.cnblogs.com/RascallySnake/archive/2010/08/03/1791365.html Jquery的api中提供了对元素应用 ...

  4. Unable to get valid context for root

    登陆时报以下错误Unable to get valid context for rootLast login: Wed Jul 24 02:06:01 2013 from 10.64.41.3 单机模 ...

  5. 备份Rhythmbox播放器的曲目和播放列表信息

    Rhythmbox音乐播放器只能保存单个播放列表,如果在rhythmbox下建了很多播放列表(比如按歌手名分类),每个播放列表下包含一些歌曲,为了避免重装系统后重新建这些播放列表,可以备份下面的文件. ...

  6. Arduino常用的数据类型以及转换

    常用的数据类型有布尔类型.字符型.字节型.整型.无符号整型.长整型.无符号长整型.浮点型.双精度浮点型等 布尔类型bollean: 布尔值是一种逻辑值,其结果只能为真(true)或者假(false). ...

  7. ysql怎么处理百分数? “%”

    )将百分数转化为小数,再以浮点数数据类型float输入 )设置字段类型为varchar数据类型,将百分数输入为文本数据,需要计算或提取出来的时候,再转化为数值类型 //转换数据类型

  8. java.util.Calendar

    package day14; import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer; import java.util.Cal ...

  9. time模块详解

    本文转自这里: 在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. 在开始之前,首先要说明这几点: 在Python中,通常有 ...

  10. Servlet和SpringMVC补课

    1.web.xml加载顺序 http://mianhuaman.iteye.com/blog/1105522 关键点:ServletContext -> context-param -> ...