文档章节

Nodejs实现TCP反向代理

小水熊
 小水熊
发布于 2014/07/11 15:38
字数 351
阅读 2310
收藏 14

场景:

你有若干机器,却只有一台能被外网访问,如果要让外网访问到你其它机器上的服务,就需要做反向代理,在上一篇文章中,我们用nodejs轻松实现了http反向代理。如果是TCP服务,例如mysql数据库,同样用nodejs来做实现一个反向代理也是很容易的。

第一种方式:

var net = require('net');
// parse "80" and "localhost:80" or even "42mEANINg-life.com:80"
var addrRegex = /^(([a-zA-Z\-\.0-9]+):)?(\d+)$/;
var addr = {
        from: addrRegex.exec(process.argv[2]),
        to: addrRegex.exec(process.argv[3])
};

if (!addr.from || !addr.to) {
        console.log('Usage: <from> <to>');
        return;
}

net.createServer(function(from) {
        var to = net.createConnection({
                host: addr.to[2],
                port: addr.to[3]
                });
        from.pipe(to);
        to.pipe(from);
}).listen(addr.from[3], addr.from[2]);

 

以上代码存到文件forwarder.js,使用方式:

node forwarder.js 3306 192.168.1.11:3306

 

第一个参数是本机监听的端口,第二个参数是要转发到目标机器的ip和端口。怎么样,是不是很简单呢。

 

第二种方式:

var net = require('net');

var LOCAL_PORT  = 3306;
var REMOTE_PORT = 3306;
var REMOTE_ADDR = "192.168.1.11";

var server = net.createServer(function (socket) {
    socket.on('data', function (msg) {
        console.log('  ** START **');
        console.log('<< From client to proxy ', msg.toString());
        var serviceSocket = new net.Socket();
        serviceSocket.connect(parseInt(REMOTE_PORT), REMOTE_ADDR, function () {
            console.log('>> From proxy to remote', msg.toString());
            serviceSocket.write(msg);
        });
        serviceSocket.on("data", function (data) {
            console.log('<< From remote to proxy', data.toString());
            socket.write(data);
            console.log('>> From proxy to client', data.toString());
        });
        serviceSocket.on("end", function () {
            socket.end();
        });
    });
});

server.listen(LOCAL_PORT);
console.log("TCP server accepting connection on port: " + LOCAL_PORT);

 

 

第一种方式使用了socoket的pipe,第二种相当于自己实现了pipe功能。

 

© 著作权归作者所有

共有 人打赏支持
小水熊
粉丝 66
博文 60
码字总数 40514
作品 1
静安
架构师
加载中

评论(1)

鱼说还休
鱼说还休
好东西,我回头反向一下MySQL玩玩
spring boot——ajax跨域

前言 java语言在多数时,会作为一个后端语言,为前端的php,node.js等提供API接口。前端通过ajax请求去调用java的API服务。今天以node.js为例,介绍两种跨域方式:CrossOrigin和反向代理。 一...

吴金瑞
06/26
0
0
在Ubuntu 14.04上设置生产环境可用的Node.js

在Ubuntu 14.04上设置生产环境可用的Node.js 提供:ZStack社区 前言 Node.js是一个开源的JavaScript运行时环境,开发者可以用它方便的构建服务器端应用和网络应用。Node.js可在Linux、OS X、...

zbill
06/26
0
0
谁说前端需要懂 Nginx 了?

--读《谁说前端不需要懂-Nginx反向代理与负载均衡》有感 读了上文发现内容虽然还是挺好的,但看完,为啥要懂nginx呀,负载均衡和前端哪里有什么半毛钱关系了,没说清楚呀。 当然这个面向前端...

vellengs
06/22
0
0
Node.js + Nginx 部署 HTTPS 服务

今天,经过无数次折腾,向往已久的域名备案终于下来了。于是迫不及待地将个人博客网站进行 HTTPS 部署迁移,中间遇到一些坑,在此做个记录。 原因 之所以要将网站从 http 迁移到 https,原因...

allenWang
06/07
0
0
socket.io搭建分布式web推送服务器

socket.io是目前较为流行的web实时推送框架,其基于nodejs语言开发,底层用engine.io实现。 借助nodejs语言异步的特性,其获得了不错的性能。但单个实例的socket.io依然承载能力有限,最多只...

骨头bone
2014/10/16
0
18

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之高级类型的多态的 this类型

转发 TypeScript基础入门之高级类型的多态的 this类型 高级类型 多态的this类型 多态的this类型表示的是某个包含类或接口的子类型。 这被称做F-bounded多态性。 它能很容易的表现连贯接口间的...

durban
21分钟前
0
0
tomcat中的几种log catalina localhost

体会 catalina.out catalina.log 是tomcat的标准输出(stdout)和标准出错(stderr) cataliana.{yyyy-MM-dd}.log和localhost.{yyyy-MM-dd}.log 是通过logging.properties配置的tomcat自己运行的......

onedotdot
43分钟前
1
0
Oracle return exit continue

常在循环体中看到下面3种语句: return exit continue 举例说明 啥都没有 -- none begin for i in 1 .. 10 loop if i < 5 then dbms_output.put_line('i < 5, i = ' || to_char......

taadis
今天
3
0
JSONObject 转换时出错 InvocationTargetException

JSONObject 转换时出错java.lang.reflect.InvocationTargetException 一时看不出来是什么问题。 挺奇怪的。 百度参考了一下这个 网页的解决方案 说是类型不对,空? 仔细查看代码,果然是有一...

之渊
今天
3
0
no such module 'pop'问题

在github上 clone 了一个 swift 项目,编译时提示"no such module 'POP'"错误,查了一下居然是因为podfile中指定的最低版本是iOS 11.0,大于我测试手机的iOS版本10.3.3,将Podfile中的最低版...

yoyoso
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部