如何利用长连接实现外网访问内网服务器?
具体的情况是:
1.内网有一个 Web 服务器(纯手工,硬件+(tcp/ip+socket+httpd)in 64KB Flash,20KB RAM,所以添加其它的协议支持很困难),该 Web 服务器与外网之间可能隔了数个路由器,不可能在每个路由器上都设置 NAT 将 Web 服务器的 80 端口暴露到外网。
2.路由器已经正确设置使得内网的 Web 服务器可以正常访问外网。
3.外网有一台固定 IP 的服务器可用。
请问如何利用外网的服务器作为代理,访问内网的 Web 服务器?
我的初步思路是:内网 Web 服务器先与外网服务器建立一个 TCP 连接,并发送含特定字段的 HTTP 请求头标示这是一个用于代理的长连接,并且当连接意外断开后重新建立一个长连接。
外网的用户要访问内网的 Web 服务器的话,只要访问外网的代理服务器,代理服务器接收到用户浏览器的 HTTP 请求后,把 HTTP 请求通过记录的长连接转发给内网 Web 服务器(这步用 PHP 能实现否?),收到内网 Web 服务器的 HTTP 响应后再转发给用户浏览器,实现对内网的访问。
不知道我的思路是否可行?是否有更简单的方法?
1楼(站大爷用户)
需要在内网的服务器上运行一个类似HTTP代理服务的程序,这个程序与外网HTTP服务器进行长连接,等待代理请求,外网的HTTP服务器收到HTTP请求时,把对应的请求转换成内网HTTP代理软件能识别的命令返回给HTTP代理软件,此时内网的HTTP代理软件收到命令并解析,向内网服务器发送请求并接收响应内容,最后以POST方式向外网服务提交响应内容,外网服务器再向请求者返回内网WEB服务的响应,整个过程完成。我之前做的WEB远程控制的课程设计用的就是这个方法,效率还可以吧,http://nh6080.sinaapp.com
整个步骤大体与题主描述相同,并且也是PHP实现。
2楼(未知网友)
我错了……改答案。
外网把要访问的资源搞到一个json包裹的数组里面
内网服务器隔一秒钟访问一次,数组不为空的时候用http的multipart把资源上载到外网服务器进行缓存。
不过这样速度很慢而且资源消耗巨大。