码迷,mamicode.com
首页 > 其他好文 > 详细

localtunnel.me 原理流程浅析

时间:2014-12-18 10:22:37      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:http   os   使用   java   on   数据   代码   amp   as   

最近公司的项目需要一个后台服务器,要求能将内网的WEB服务器暴露在外网上。于是,就在网上到处搜开源项目。找到两个口碑不错的项目(没验证过,人云亦云吧):localtunnel.me和ngrok。前者是javascript语言开发的,后者是go语言开发的。正好又在写一个前端,学习javascript中(全栈工程师!!),就git clone下来看看吧。在这篇文章里,只对原理和流程进行说明,不做代码分析。我一向认为好的代码就是好的文档,虽然还是刚刚接触javascript这种原型语言,还看不出代码质量好坏,但是localtunnel的注释和代码本身还是让人很容易理解的。

我在分析localtunnel.me的代码时,是服务器端和客户端对比着看的。这样可以比较容易看懂服务器和客户端是如何交互的。

总体来说localtunnel.me的原理还是很简单的,首先必须有一台能在公网访问的服务器作数据中转用,localtunnel.me的服务器端程序就部署在这上边。服务器程序一边监听浏览器的http请求,一边监听客户端的tcp请求。服务器将HTTP请求转发到对应的客户端。客户端程序又将HTTP报文转发到本地对应WEB服务器端口。这样,就实现了内网web服务器的公网映射。

我们主要看看localtunnel.me的工作流程:

1.监听80端口,当然也可以是其他端口,等待客户端或浏览器的http请求。

2.服务器在接收到一个HTTP请求时,会判断当前请求的域名是主域名还是子域名。这时会有两种处理流程,主域名提供了新的通道创建功能,子域名则用来转发HTTP请求

3.如果请求的URL是主域名,且URL为类似这样的请求:http://www.exampleserver.com/?new或http://www.exampleserver.com/xxxxxxxxxx。服务端程序会创建一个TCP服务器,并把相关信息返回给对应的客户端。这些信息包括服务器新监听的TCP端口号,以及完整的子域名。
这里要说明一下,域名www.exampleserver.com必须是顶级域名(当然,也可以不是,只要做二次开发)。
new表示生成一个随机的子域名,或者指定子域名为xxxxxxxx.exampleserver.com。

4.客户端收到服务器返回的信息后,就会与服务器创建一条TCP连接,hostname是服务器的域名或IP,port是刚才服务器返回的信息中的port。这样,客户端和服务器就建立起一条长连接。当客户端与服务器的TCP链接建立成功后,会马上建立与本地WEB服务器的TCP链接。注意是TCP链接,不是HTTP链接。

5.当地球上的某个浏览器通过子域名的方式访问http://xxxxxxxx.exampleserver.com时,服务器端程序会在一张大表里找xxxxxxxx这个子域名名字对应的客户端socket连接,并将http请求转发过去。localtunnel.me使用bouncy库来实现转发功能。


ok,到这里,服务器端的大部分工作都完成来,现在HTTP的请求到了客户端。

6.客户端收到了http请求的数据后,就在远程服务器和本地WEB服务器之间建立一条pipe。不过,在首次转发之前,需要修改HTTP头的Host字段为本地服务器地址



localtunnel.me 原理流程浅析

标签:http   os   使用   java   on   数据   代码   amp   as   

原文地址:http://blog.csdn.net/jt6562/article/details/41986447

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!