还记得以前做微信支付的时候,需要微信的服务器回调结果给我们,虽然微信服务器可以直接访问我们云服务器,但是想在本地debug的话,还得需要一些诸如frp、ngrok的工具来做映射,但是当时大一年少无知,这些工具后来才知道,硬生生的先把采集信息的工程部署的云服务器,然后在触发一次微信支付,让微信服务器回调一下,把他传递的数据保存下,在回到本地写校验逻辑,一来一去做测试,非常的慢而且麻烦,最后做完了,也来回了七八次。
后来知道了frp和ngrok,非常的方便,运行后访问他给出的域名,即可让外网访问本地指定的端口,这样就实现了内网映射。但是他们太慢了,有时候延迟了一两秒。
于是就想自己做一个,我是属于能自己写出来的不会用第三方的,虽然有很多此类开源的项目,比我写出来的更好,但是技术总归是人家的,毕竟做咸鱼,也要最最最最咸的那条。
项目地址:
https://gitee.com/hxl495/java-intranet-mapping
下面看一下演示。
项目演示如果要运行,需要准备一台云服务器,这套工具的原理就是:服务器开两个端口,端口A负责监听http请求,将接收到的数据转发到端口B上,端口B会和我们本机相连,本机最后通过Okhttp等工具向本机指定端口上进行http请求,然后在一层层返回。
我们把jar包上传至云服务器进行如下命令操作,http端口号为80,意味着我们可以直接通过域名去访问,socket端口为7070,就需要我们本机上指定连接的远程端口为7070。
root@iZbp1brrrx37m2ijwcg751Z:/usr/app/jar# java -jar InnerNetOut-Server.jar
【-------------------------------------------------】
启动服务端
java -jar x.jar server http=7777 socket=1010
http:外界网络发起http请求时,服务端所监听的端口
socket:服务端收到信息后,将在此端口中转发数据
启动客户端
java -jar x.jar client server=1010 forward=8080
server:连接服务器的端口
forward:转发到本地的端口
【-------------------------------------------------】
root@iZbp1brrrx37m2ijwcg751Z:/usr/app/jar# java -jar InnerNetOut-Server.jar server http=80 socket=7070
Jan 24, 2021 10:13:47 AM com.h.net.server.LocalSocket initAbstractSelectableChannel
INFO: Socket 服务器启动成功,端口7070
Jan 24, 2021 10:13:47 AM com.h.net.server.HttpNioServer initAbstractSelectableChannel
INFO: HTTP 服务器启动成功,端口80
接着在本地启动客户端,他需要三个参数,分别是远程主机端口,远程主机ip,将转发在哪个端口?
jav-jar InnerNetOut-Server.jar client server=7070 remoteip=www.xxxxx.com forward=8080
然后在本地启动一个项目,简单写一个GET请求,启动的端口号为8080。
@GetMapping("test")
public String test(){
return "test";
}
然后直接访问您的域名,即可映射到本地,在加上上次写的Tomcat Class热替换,为了让Tomcat支持热替换,我直接修改了他的源码,完美解决微信回调问题。
原理即实现流程相对简单,就是通过纯Socket去转发而已,但是在项目中使用的是NIO,当然里面还有几个不完善的地方,等待去改进,如容错处理,图片问题,对,涉及到文件传输暂时还不支持,但是HTTP中头部信息都可以进行转发。