公司的代码是可以在公网上访问到,但这些代码里用了部署在公司局域网的api。如果有时想在家写代码看看这个wpf软件的运行情况,就运行不起来,因为主要业务都得连接公司局域网的api接口。我就想用自己的阿里云服务器搭建一个代理,来访问公司的局域网。最终实现情况,在家里做了测试,家里一台台式,一台笔记本,2个路由器,一个电信的光纤入口网关。那我把台式和笔记本分别连接不同的局域网,无法再台式上ping通笔记本的网络。在台式上访问部署在云服务器上的中转服务,成功的访问到了笔记本上部署的api了。这样把笔记本环境换成公司环境,也应该是能够成功访问到公司的局域网api的。
具体的步骤是这样的:
1、在访问端A(我的台式,台式ip:192.168.31.11),部署一个监听端口比如7088的本地socket服务端,把api的访问地址就改成:Http://192.168.31.11:7088/swagger/index.html;本来这个api的地址可能是公司内网的地址比如:192.168.2.14:8088。我们改了是为了能把请求打到我们部署在本地A的socket上。部署好这个本地socket服务端,先测试一下请求,发现可以把浏览器的http请求打印到控制台,这一步就完成了。
2、部署到云服务的中转代理服务器ProxyServer。也是socket写的。主要作用是把A客户端的请求,发送到部署到公司的ClientB,并把clientB的api的Response返回给ClientA,也就是起到本地A端和公司局域网B端的Http请求和返回的中转的作用,另外在这个ProxyServer里还有一个接收B客户端的心跳的SocketClient。这个中转服务监听的端口需要在阿里云服务器的规则里放行,不然访问不了。
3、部署在公司的ClientB,这个ClientB主要是包含三个socket Client,一个连接中转服务器的Socket客户端,用于接收clientA发向中转服务器,再由中转服务器发送过来的请求;一个是连接公司局域网的api的端口,用于访问最终的公司局域网的api接口;一个是心Socket跳客户端,用于公司断网后,等网络恢复了,能重新连接到中转服务器。
4、 最终先要启动中转服务器,再启动ClientB。
总的来讲,就是本地A端连接ProxyServer,公司ClientB端也连接ProxyServer,ClientB端再连接部署在公司局域网的api的端口,然后,本地A端发往B端的请求,先要打到ClientA上,再由ClientA发送给ProxyServer,通过ProxyServer转发给ClientB,最后由ClientB发往真正的api的端口,然后依次返回接收Response,最终呈现给A端。访问swagger首页,就可以在浏览器上看到swagger的首页,并且在swagger上请求post, 也是可以收到返回的内容的。
代码写的简陋,无法处理复杂逻辑,断网重连后,还需要重启本地的ClientA,才能继续访问到公司局域网的api。通过这次实践,我踩的坑主要是:
1、判断post和get请求是否是一个完整请求体的方法不一样,get请求,直接\r\n\r\n就可以,但是psot请求,必须获取postData的长度,所以最终通过deepseek给出的方法,就解决了这个问题。
2、必须一个request,一个response一一对应。我就遇到了A请求发完,B请求继续发,但A请求收到了长度是0的返回内容,那后续B的请求就收不到返回,页面就卡死了,无法继续后面的请求。所以ClientA 发给ProxyServer,ProxyServer发给ClientB的,以及从ClientB返回ProxyServer,ProxyServer返回到ClientA。都是同步的。
3、一次请求就必须新建一个Client连接到ProxyServer,但连接到ProxyServer的ClientB只能是一个。
4、必须判断返回的Response,是否全部读取完毕,我是把每次循环读取的Resposne拼接成字符串,等到这个字符串以"0\r\n\r\n"结尾,我就认为该Respose已经全部返回完毕。目前这样判断是没问题的。
5、在ClientB中,要把请求体的Host更改为实际api的ip和端口号,不然,无法访问到api。通过deepseek给出的请求体的host转换代码也是能用的。
Socket实践:使用云服务器当代理连接公司内网,简单实现跨局域网调用部署在公司局域网里的api接口
HelloLLLLL2025-05-03 22:57