最近运行了2年的个人网站,即将到期了,网站用户量不大,想着使用公司的工作机子做服务器勉强玩一玩撑一撑好了,但是需要搞一个NAT穿透工具。于是走上了一个对比之路。。

最近因为接了一个项目,完成的差不多了,需要给用户进行演示,就想着把自己的电脑当做服务器用一阵子,但要解决的是我的电脑都是在内网,没有一个公网,这就需要一个内网穿透工具,于是发现市面上一般有这四款比较出名。其中商业化运营的比较成功的是花生壳和神卓互联,前者限制流量,后者不限制可以永久使用,都比较成熟的两款,很多企业项目在用,还有的就是开源的,不能进行商业化运作,如ngrok和FRP。

其中ngrok可能有的人会比较熟悉,最大的缺点就是网速慢和不支持自定义域名,次开关机后,需要手动启动。比较麻烦。而FRP也用过了,自己的观点是需要一台有外网IP的服务器(这是我绝对不想的,我就是不想再买个服务器啊)用时,需要配置好服务器端、和C端。然后各自启动。还有更坑的,若是使用国内的服务器,指向的域名还必须是备案的。。不然会被服务商封掉。

当然ngrok和FRP这里就不多数了,毕竟用的人不多,没有什么社区,今天重点讲的是一般商业化的东西市面上都会有很多企业在竞争,为什么国内只有花生壳和神卓互联两家公司,其中最核心的技术难点在哪?

注意,这里所说的内网穿透技术不是动态域名解析,那个没啥用,国内运营商一般都是限制使用80和443端口,再怎么解析也没有用,那有人说我不用80端口还不行嘛,可以呀,但是你的应用必须要在一级路由下,多级路由想都别想,当然,有的人说了那我换到一级路由下还不行嘛,呵呵,那也没有用,因为你的IP还不是绝对的公网IP,国内运营商IP资源稀缺,大部分家庭和企业的带宽都是运营商的虚拟局域网,我们用的IP都是内网的,这个时候动态域名解析就没有用,所以要想外网访问内网,只有使用内网穿透技术了。

接下来说明一下原理,

这里用Java socket技术实现。因为Java里有nio,用户通过TCP访问服务器 A,服务器 A 再把 TCP 请求转发给服务器 B;同时服务器 A 把服务器 B 返回的数据,转发给用户。也就是服务器 A 作为中转站,在用户和服务器 B 之间转发数据。

神卓互联

其中,服务器A作为用户和服务器B之间的中转站,转发TCP的数据。

服务器B是用户真正访问的服务器,用来接收用户的请求,并且可以向用户发送数据。

先写一个Main.java


import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;public class Main {/*** 当前服务器ServerSocket的最大连接数*/private static final int MAX_CONNECTION_NUM = 50;public static void main(String[] args) {// 启动一个新线程。检查是否要种植程序。new Thread(new CheckRunnable()).start();// 当前服务器的IP地址和端口号。String thisIp = args[0];int thisPort = Integer.parseInt(args[1]);// 转出去的目标服务器IP地址和端口号。String outIp = args[2];int outPort = Integer.parseInt(args[3]);ServerSocket ss = null;try {ss = new ServerSocket(thisPort, MAX_CONNECTION_NUM, InetAddress.getByName(thisIp));while(true){// 用户连接到当前服务器的socketSocket s = ss.accept();// 当前服务器连接到目的地服务器的socket。Socket client = new Socket(outIp, outPort);// 读取用户发来的流,然后转发到目的地服务器。new Thread(new ReadWriteRunnable(s, client)).start();// 读取目的地服务器的发过来的流,然后转发给用户。new Thread(new ReadWriteRunnable(client, s)).start();}} catch (IOException e) {e.printStackTrace();} finally {         try {if (null != ss) {ss.close();}} catch (IOException e) {e.printStackTrace();}}}}

ReadWriteRunnable 类。创建对象的时候接受两个 Socket 作为成员变量。从一个 Socket 中读取数据,然后发送到另一个 Socket。

 import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class ReadWriteRunnable implements Runnable {/*** 读入流的数据的套接字。*/private Socket readSocket; /*** 输出数据的套接字。*/private Socket writeSocket;/*** 两个套接字参数分别用来读数据和写数据。这个方法仅仅保存套接字的引用,* 在运行线程的时候会用到。* @param readSocket 读取数据的套接字。* @param writeSocket 输出数据的套接字。*/public ReadWriteRunnable(Socket readSocket, Socket writeSocket) {this.readSocket = readSocket;this.writeSocket = writeSocket;}@Overridepublic void run() {byte[] b = new byte[1024];   InputStream is = null;OutputStream os = null;try {is = readSocket.getInputStream();os = writeSocket.getOutputStream();while(!readSocket.isClosed() && !writeSocket.isClosed()){int size = is.read(b); if (size > -1) {os.write(b, 0, size);}}} catch (IOException e) {e.printStackTrace();} finally {try {if (is != null) {is.close();}if (null != os) {os.flush();os.close();}} catch (IOException e) {e.printStackTrace();}   }}}

在命令行执行这个程序的时候,需要输入四个参数。分别是当前服务器IP地址、当前服务器端口、目的地服务器IP地址、目的地服务器端口。

由于是入门的,所以这里就用socket技术解释了下,一般商业化的产品都是用多路复用技术,不是简单的socket就能支撑的。以下是网站的截图,可以看到都是支持多映射绑定,每条映射都必须有断线重连机制,这个不是很难,难得是流量大的时候要保持稳定,毕竟做ToC最需要的是稳定,后来自己努力做了一个内网好像已经放github上了,

神卓的

花生壳的

看到评论有说怎么连接到内网,其实通道建立之后就已经可以连接了,要把模式设置成非阻塞,不然速度会很慢。

花生壳和神卓互联的NAT产品为什么没有其它公司做出来(分析很到位)相关推荐

  1. 常见内网穿透-花生壳、神卓互联、FRP、ngork分析

    最近搜集和整理了当前主流的内网穿透工具,今天抽空来分析一下: 目前企业级主流的穿透技术是PHTunnel和Wangooe Tunnel技术 目前国内内网穿透企业级的服务商有花生壳和神卓互联,我接触过很 ...

  2. 花生壳和神卓互联内网穿透那个好用?

    目前企业级主流的穿透技术分别是花生壳和神卓互联,虽然两家公司在稳定性方面表现相当,用户可以根据自己的需求和喜好选择其中之一作为内网穿透服务.无论选择哪一个,都可以享受到高质量.稳定可靠的内网穿透服务. ...

  3. 外网怎么访问内网_神卓互联搭建远程桌面和web应用(很详细)

    外网怎么访问内网_神卓互联搭建远程桌面和web应用,我们都知道国内IP资源严重不足,导致运营商商们都不给固定的IP,都是动态分配的,现在基本的已经是100或者10开头的局域网的IP,运营商的ADSL网 ...

  4. 神卓互联是什么?优秀的内网穿透

    本文介绍神卓互联是什么以及如何通过神卓互联实现内网穿透访问公司的ERP. 神卓互联的优点和缺点 优点:可玩性高,安全性高,关键是免费,稳定和速度都比较高,有图形操作界面,不需要命令行,小白都可以不用学 ...

  5. 快速实现内网穿透已成功(神卓互联搭建外网访问内网应用)巧妙绕过路由器

    内网穿透在实际生活中,我们经常会在内网里部署服务让外网访问内网应用,比如Apache,Tomcat,数据库,微信小程序的开发以及企业的一些管理软件(OA.CRM.ERP),还有远程桌面等等的外网都是无 ...

  6. 内网穿透之使用神卓互联V8.5.9客户端访问用友ERP系统

    由于工作原因平时经常帮客户安装神卓互联系列软件,最近神卓互联官方发布了内网穿透私有云V8.5.9版本的客户端,界面变化还是比较大的,从以前黑色变成了白色,按钮和布局也发送了改变,有必要写一篇记录一下, ...

  7. (不打广告)推荐这款永久免费内网穿透软件-神卓互联

    内网穿透是一种将内部网络中的应用程序公开到公共网络上的技术.在许多情况下,由于网络安全限制或配置问题,内部网络中的应用程序可能无法通过公共网络访问.这时,内网穿透技术就可以解决这个问题,使得我们可以在 ...

  8. (原)神卓互联内网穿透远程桌面方法

    转载自:https://www.shenzhuoyun.com/post/10083,亲测可用,吐血推荐,版权归原作者所有,该帖只做个人记录使用. 场景一:有一些时候,比如,我们回家了,或者外出,有紧 ...

  9. 神卓互联内网穿透微信公众平台 API 实现微信登录

    神卓互联是一家专注于内网穿透和互联网软件开发的公司,其提供的内网穿透服务和微信开发能够满足众多企业和个人的需求.本文将介绍神卓互联的内网传统微信开发服务. 在内网中使用微信开发具有一定的困难,因为微信 ...

最新文章

  1. LeetCode 122. Best Time to Buy and Sell Stock II--贪心--Java,C++,Python解法
  2. 程序猿的日常——Java基础之equals与hashCode
  3. Java NIO.2 Files类的常用方法
  4. boost::mpl模块实现list_c相关的测试程序
  5. [图像处理] 直方图均衡化原理 - 数学推导
  6. WebAssembly生态将完善网络安全性
  7. 如何在ADF中将参数传递给ActionListener
  8. DropDownList实现无限分级
  9. 为什么云原生+分布式是数据库的未来?
  10. python2多线程_python_并发编程——多线程2
  11. php 易宝支付,易宝支付
  12. 中国安检设备行业市场发展分析及前景趋势展望报告2022-2028年
  13. [Maven]讲讲它的构建生命周期和拉取 jar 包流程
  14. 红孩儿编辑器模块设计7
  15. html链接外部样式表、链接网站图标
  16. SAP中由于“己结算申请”未勾选原因导致无法查询到采购申请
  17. git push 拒绝连接_git push被拒绝的处理方式
  18. 实例6,stc8a8k单片机开发板4脚的OLED显示数据(I2C通信)
  19. 计算机关闭远程桌面,windows 远程桌面关闭 运行程序退出
  20. TIA Portal面向对象编程入门

热门文章

  1. 企业信息化如何破冰(一)
  2. C#4.0权威指南(奋斗的小鸟)_PDF 电子书
  3. 【花雕动手做】有趣好玩的音乐可视化系列项目(29)--16X16硬屏灯
  4. 水果店水果处理方案,水果店不新鲜怎么处理
  5. 阿里巴巴无人零售店火了 盘点国内外还有哪些无人零售店
  6. http://www.iteye.com/job/topic/1119480?page=4http://www.iteye.com/job/topic/1119480?page=4
  7. 共享wifi贴地推项目怎么选择?
  8. [python自动化]简单实现接口自动化测试(基于python+unittest)
  9. STC32G单片机驱动1.8寸TFT LCD128X160 ST7735S SPI串口驱动示例
  10. 功夫熊猫(Kungfu Panda)观后感