node js 初次接触
来源:互联网 发布:字符数组赋值 编辑:程序博客网 时间:2024/05/21 06:42
其实去看nodejs不是因为喜欢他,或则他有多好用。
纯粹是因为,之前ace的服务器能访问内网,而ace的环境只支持php和nodejs,所以,就有这个想法,想通过在ace服务器上部署一个proxy,这样,周末就能在家访问内网的机器和服务,而不用vpn和动态口令了。另外一方面,用了vpn,本身的网络感觉也有变慢。所以。。。
网上找了proxy的例子,很详细,看了下,就把他部署到自己的测试linux虚拟机上去了。
代码如下:
var net = require('net');var local_port = 8893;//在本地创建一个server监听本地local_port端口net.createServer(function (client){ //首先监听浏览器的数据发送事件,直到收到的数据包含完整的http请求头 var buffer = new Buffer(0); client.on('data',function(data) { buffer = buffer_add(buffer,data); if (buffer_find_body(buffer) == -1) return; var req = parse_request(buffer); if (req === false) return; client.removeAllListeners('data');var net = require('net'); var local_port = 8893;//在本地创建一个server监听本地local_port端口net.createServer(function (client){ //首先监听浏览器的数据发送事件,直到收到的数据包含完整的http请求头 var buffer = new Buffer(0); client.on('data',function(data) { buffer = buffer_add(buffer,data); if (buffer_find_body(buffer) == -1) return; var req = parse_request(buffer); if (req === false) return; client.removeAllListeners('data'); relay_connection(req); }); //从http请求头部取得请求信息后,继续监听浏览器发送数据,同时连接目标服务器,并把目标服务器的数据传给浏览器 function relay_connection(req) { console.log(req.method+' '+req.host+':'+req.port); //如果请求不是CONNECT方法(GET, POST),那么替换掉头部的一些东西 if (req.method != 'CONNECT') { //先从buffer中取出头部 var _body_pos = buffer_find_body(buffer); if (_body_pos < 0) _body_pos = buffer.length; var header = buffer.slice(0,_body_pos).toString('utf8'); //替换connection头 header = header.replace(/(proxy\-)?connection\:.+\r\n/ig,'') .replace(/Keep\-Alive\:.+\r\n/i,'') .replace("\r\n",'\r\nConnection: close\r\n'); //替换网址格式(去掉域名部分) if (req.httpVersion == '1.1') { var url = req.path.replace(/http\:\/\/[^\/]+/,''); if (url.path != url) header = header.replace(req.path,url); } buffer = buffer_add(new Buffer(header,'utf8'),buffer.slice(_body_pos)); } //建立到目标服务器的连接 var server = net.createConnection(req.port,req.host); //交换服务器与浏览器的数据-- VISUAL LINE -- 1,1 Top { var arr = s.match(/^([A-Z]+)\s([^\:\s]+)\:(\d+)\sHTTP\/(\d\.\d)/); if (arr && arr[1] && arr[2] && arr[3] && arr[4]) return { method: arr[1], host:arr[2], port:arr[3],httpVersion:arr[4] }; } else { var arr = s.match(/^([A-Z]+)\s([^\s]+)\sHTTP\/(\d\.\d)/); if (arr && arr[1] && arr[2] && arr[3]) { var host = s.match(/Host\:\s+([^\n\s\r]+)/)[1]; if (host) { var _p = host.split(':',2); return { method: arr[1], host:_p[0], port:_p[1]?_p[1]:80, path: arr[2],httpVersion:arr[3] }; } } } return false;}/*** 两个buffer对象加起来*/function buffer_add(buf1,buf2){ var re = new Buffer(buf1.length + buf2.length); buf1.copy(re); buf2.copy(re,buf1.length); return re;}/*** 从缓存中找到头部结束标记("\r\n\r\n")的位置*/function buffer_find_body(b){ for(var i=0,len=b.length-3;i<len;i++) { //if ((b[i] == 0×0d) && (b[i+1] == 0×0a) && (b[i+2] == 0×0d) && (b[i+3] == 0×0a))
//这里原来的例子是用16进制表示,但是不知道为什么老是报下面的错误,所以我把他改成了十进制的,就好了。
/*/home/admin/chat/proxy.js:116 if ((b[i] == 0×0d) && (b[i+1] == 0×0a) && (b[i+2] == 0×0d) && (b[i+3] ^node.js:201 throw e; // process.nextTick error, or 'error' event on first tick ^SyntaxError: Unexpected token ILLEGAL
*/
if ((b[i] == 13) && (b[i+1] == 10) && (b[i+2] == 13) && (b[i+3] == 10)) { return i+4; } } return -1;}
然后,用node proxy.js & 直接运行服务
在本机设置代理访问正常。
然后,需要把这个服务放到ace上去,通过ftp传上去之后,发现起不来,悲剧。。
查看了ace的论坛,发现如下:
禁用API
- child_process
- net.listenFD()
- net.listen()
仅支持port与callback参数, 不支持监听unix domain sock与指定监听ip - fs.rename()/fs.renameSync()
不支持对目录进行操作 - fs.link()/fs.linkSync()
- fs.symlink()/fs.symlinkSync()
原来,net.listen()是禁用的api,怪不得起不来。。。
无语了。
本来想通过http的重定向来做代理,但是某位同学告知,ace服务器访问内网的权限被咔嚓掉了,于是,最后的一点动力也没有了。。
不过感觉是,这玩意儿,确实挺简单,方便的。
另外ace也不错,就是限制太多了。。。
- node js 初次接触
- node.js 初次接触
- 初次接触JS
- 初次接触JS(二)
- node.js初接触
- 初接触Node.JS
- node js 的初次谋面
- Node.js 初次使用心得
- 初次接触
- 初次接触
- 初次接触
- 初次接触HTML+CSS+JS遇到的问题
- node.js接触篇之-下载安装
- 初次接触EJB
- 初次接触MFC
- 《英雄无敌 V》初次接触!
- 初次接触linux 总结:
- 初次接触power architecture
- 第4章练习题--2--All in All--2976
- 2038问题
- u-boot 启动过程 (基于S3C2410) 和uImage zImage 启动分析
- ubuntu samba配置。。。。
- 拦截器参数传不过来问题
- node js 初次接触
- JetPlayer
- 可重入和不可重入
- 2011.11.9 克服紧张情绪
- WebLogic Server用户名和密码问题
- C++项目依赖项
- 设计模式之---装饰者模式
- U-Boot的常用命令详解
- HDFS的设计