内网穿透_外网怎么访问内网的tomcat服务器应用,已解决!

 

我们会经常写一些JSP的项目,也就是javaweb,每次写好后都希望能让老师或者同学可以直接访问自己的项目,我们刚开始只是测试,不可能去花很多钱买云服务器去部署,所以能在自己的电脑上搭建一个tomcat让外网的人可以访问到成了困扰我们的公开问题。这里就来说一下自己的心路历程。

我们分为三步走来实现:(我这里用的示例javaweb程序是我自己简单写的一个小程序myWeb)

1,

我们用Tomcat服务器,如果我们的javaweb程序已经部署到了Tomcat服务器,一般我们在本地访问的地址为:localhost:8080/shop1,localhost指本机,即127.0.0.1,8080端口号,shop1你部署的项目名称,但太过繁琐,我们只想通过IP地址来访问我们的项目,即127.0.0.1或者localhost,我们只需修改一下Tomcat的配置即可,打开Tomcat所在的目录,打开conf文件夹,打开server.xml文件,所要修改的部分如下:

<Connector port="8080" protocol="HTTP/1.1"  
  
               connectionTimeout="20000"  
  
               redirectPort="8443" />  
  
   
  
<Context path="" docBase="myweb" reloadable="true" />  

有人说将port从原先的8080修改成80,因为http协议的默认端口是80,这样你就可以不用再输端口号了,这样说是对的,其实也没必要,应为等会要用内网穿透技术,通过端口映射技术内网是什么端口已经没有那么重要了,把docBase="myweb"的值修改成你所部属的项目的名称,默认指向你的项目,这样你就可以不输项目的名称了。当然不该也行,就是在访问项目的时候要加上项目名称。建议修改一下,毕竟正式发布的时候都是要去掉的。

OK,这样的话,你在浏览器里输入localhost就可以访问你的项目了!

上一步我们只实现了自己访问,但如何让外网的同学访问,这里可能涉及了简单的网络知识,我网络学的也不是很好。就说的比较通俗一点。有两种情况(1)你上网没有用路由,运营商单独分给你一个IP地址,那你直接可以用你的IP让外网的同学来访问你的网站,我们这里用的是8080端口,所以形式为:XX.XX.XX.XX:8080。为了让多的同学了解,我在啰嗦一下,怎么知道自己的IP地址,你不必用在cmd命令行输入ipconfig这种略显专业的方法去获取,其实只要在百度搜索“IP查询”,第一个就是。

(2)用了路由器,一个路由器带了好几台电脑,比如说跟室友,这就需要你去路由管理页面去设置一下,端口映射,让别人访问你们的IP地址时,映射到你的电脑,在浏览器中输入192.168.1.1(以你的路由为准),进入路由管理页面,操作如下图:

1、开始设置

登录路由器管理界面,进入 转发规则 >> 虚拟服务器,并点击 添加新条目

2、添加tomcat服务器规则

填写应用的服务端口号(对外开放端口)、内部端口号(服务器实际端口)、服务器IP地址,由于我们上面写的是8080,所以这里的服务端口号和内部端口号都是填8080,IP地址填tomcat的主机地址,一般是内网192.168开头的,这个不会查看的自己百度一下,一大堆,这里不多说,然后填写好后点击 保存

 

3、确认规则启用

进入 转发规则 >> 虚拟服务器,如图所示表示创建成功。

 

至此,虚拟服务器规则设置完成。

根据以上设置,Internet中的客户端通过浏览器访问121.202.33.100(WAN口IP地址),即可访问到tomcat的应用。通过浏览器访问网页服务器,访问形式如下:

这时可以把这个网址发给你的同学,试一下,他能不能访问你的tomcat应用,答案是肯定的!

但是又有新问题了,你第二天打开路由,或者再次上网时,运营商会重新分配给你一个新的IP地址,难道你让你同学访问时,再次把这个IP地址发给他吗?显然这是不合理了。

此时,我们就想有一个固定的IP该多好。这里给大家介绍一款软件“神卓内网穿透软件”,下载安装,然后注册后,你就会获得一个固定的IP地址,每次开机自启后,你可以用这个新的固定的IP访问自己的项目,话不多说,首先第一步添加映射规则,

1,应用名称填写项目的名称,如crm、网站等。

2,服务器IP填写自己内网的IP地址。

3,端口号填写应用的端口号,这里填tomcat的默认的端口号8080,如果你修改过,则填写你修改后的端口号。

4,最后确认还之后点击确认添加即可。

 

最后复制一下分配给你的外网固定的IP,也就是公网IP,在浏览器地址栏输入新的IP地址访问tomcat项目,是不是成功了呢!

 

 

下面就来说说神卓互联穿透内网的SQLServer数据库

问题:
搭建在内网里的数据库实例是没有外网地址的,如sqlserver,mongodb,redis等,这些数据库是没有提供外网地址的,只能使用同账号同地域的服务器内网连接,那我们想要从外部来访问数据库要怎么办呢?


解决方案:
通过下载神卓互联内网穿透软件实现将内网的数据库应用映射到外网。

 


简单示例(一):
1.测试环境
服务器一台,内网ip:10.105.243.140   数据库端口是1433

 

打开已安装好的神卓互联客户端

 

 

打开会自动登录到客户端界面

在客户端界面的左下角有一个添加映射按钮,点击填写SQL Server映射信息

应用名称填写SQLServer

服务器IP填写10.105.243.140

端口号填写1433

然后点击确认添加按钮

 

 

打开链接连接客户端

 

 

输入神卓互联映射的IP和端口号,注意,加端口时要逗号隔开

 

 

如果要了解内网穿透的话,那么我们首先要了解到必须要远程访问相关机器,对于大部分的人群来讲,要通过远程访问的这种服务来了解到相关路由器,究竟是想控制电脑还是想远程开机,其实这个教程基本上在你进行内网穿透的过程当中也会给你带来更好的体验。其实现在不单单是一些普通的小运营商,就连电信和联通这样的一种大运营商,也都在逐步的把更多的用户丢到私有的IP里,很多地方直接都是通过外网的IP来进行访问,但是外网IP因为无法来叠加带宽,所以如果要进行内网穿透的话,完全可以申请进入到内网IP,然后再获得带宽,这个时候也需要用到内网解析。

其实在做内网穿透的时候,有很多比较出名的穿透软件,不过这些穿透软件的缺点基本上也非常明显,我们在进行内网穿透的时候最好能够利用相关工具,很多工具的教程都有所不同,关键就看每一个人在选择内网穿透的时候究竟选择的是哪个工具。

 

想要建设内网穿透,并没有我们想象中的那么简单,提前要准备很多东西,域名是必须要准备的,怎么来获得这个域名,直接可以到阿里云上来进行购买,当然你也可以通过其他的购买途径来购买,选择最便宜的就可以一年只要几块钱,域名注册好了之后就可以放在那儿了,紧接着要准备虚拟服务器。虚拟服务器千万不要买国内的,因为国内的需要备案80个端口,这是非常麻烦的,基本上也不对外做网站,所以可以直接选择香港或者是美国的,香港的性价比相对来说会比较高一点,美国比较便宜,但是它的速度比较慢,有的时候可能会用到欧美的,欧美的大家可以仔细选择一下。紧接着就可以直接进入到操作流程,每一个vps都有一个固定的IP地址选择相关按钮进入到服务器管理,进入到操作管理窗口,点击左侧的导航栏,可以看到右边框有很多系统可供选择,这个时候就一定要选择适合自己的系统,建议大家在这一步选择专业的时候来安装,因为它会根据你所在区的内网穿透的系统来选择,选择好了之后就会弹出来一个IP地址。

最基本的内网穿透原理:

户通过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){
                // 用户连接到当前服务器的socket
                Socket 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;
    }
 
    @Override
    public 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();
            }   
        }
 
    }
 
}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值