现在的位置: 首页 > 综合 > 正文

java获取本地局域网的外网IP ….

2013年10月08日 ⁄ 综合 ⁄ 共 5234字 ⁄ 字号 评论关闭

近日为了满足2个屋子里人的通信需要,需要将本地的外网IP告诉给另一个屋子里的人。以前都是在群里喊一句,我这里的IP是XXXX,有一天自己突发奇想,想通过程序来实现这个自动化通知的过程。于是自己给自己定了需求。

      需求:基本目标实现开机将本地的路由WAN口IP通知对方。

      思考:如果才能实现自动通知呢?

      首先,要有一个公共的空间,可以作为通知的载体。

      其次,需要传输机制把通知发出去。

      经过思考,我想到了电子邮件,邮箱是每个人都有的,email是可以用程度发的。于是需求变成了通过发邮件的方式把最新获取到的IP发出来。解决的思路有 了,最大的问题是如何获取外网IP,开始尝试获取本地IP,这个显然是没用的,因为机器是在内网环境,获取到的只是内网IP,后来试图想通过获取外网 IP,比如访问一个XXX网站的形式来获取IP,这种网站还真不少,但是获取到的都是公网IP,学过网络的人都知道公网IP很少,往往只是在网络节点上的 IP,这种IP对我一个ADSL用户来说几乎就没任何意义。其实我需要的只是路由的WAN口IP。网上搜了一下,也没找到合适的。在几乎绝望的时候,我想
到了代理,我能不能通过访问路由器的方式来获取IP呢,我试图用telnet登陆路由,试图用路由命令来操作路由,结果和我想象的一样,家用路由毕竟不是 服务器级别的路由,根本没有对外提供的访问命令,只能通过web的方式来实现对路由的设置。自己再次陷入了绝望,后来我打开fireBug,试图找到IP 那个查看IP跳转的页面。结果被我找到了,http://192.168.1.1/userRpm/StatusRpm.htm,点开页面查看响应,传过 来的就是网页的部分信息。OK,这就是我想要的IP。我突然兴奋起来,但是这似乎还不够,因为每次登陆路由时要输入用户名和密码。网上搜搜,这个其实不
难,代理服务程序就那样写的。经过一晚上的思考和实践WAN口IP算是被我搞出来了。

Java代码  收藏代码
  1. package com.eehome.app.mail.utils;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.InputStreamReader;  
  7. import java.net.Authenticator;  
  8. import java.net.URL;  
  9. import java.util.regex.Matcher;  
  10. import java.util.regex.Pattern;  
  11.   
  12. import com.eehome.app.mail.IMailConstant;  
  13. import com.eehome.app.mail.model.RouterPassAuth;  
  14.   
  15. /** 
  16.  * @author wensong 
  17.  * 2010-9-4 下午03:34:58 
  18.  */  
  19. public class RouteIpUtils {  
  20.   
  21.     private final static RouteIpUtils routeIpUtils = new RouteIpUtils();  
  22.       
  23.       
  24.     private RouteIpUtils() {  
  25.   
  26.     }  
  27.   
  28.     public static RouteIpUtils getInstance() {  
  29.         //验证器工具的实例进行注册  
  30.         Authenticator.setDefault(new RouterPassAuth());  
  31.         return routeIpUtils;  
  32.     }  
  33.   
  34.     public String getRouteIp() throws IOException {  
  35.         StringBuffer wanPacket = getWanPacket();  
  36.         return getFirstIp(wanPacket);  
  37.     }  
  38.   
  39.     /** 
  40.      * 获得路由Web中的状态页面上的数据 
  41.      *  
  42.      * @return 
  43.      * @throws IOException 
  44.      */  
  45.     private StringBuffer getWanPacket() throws IOException {  
  46.         URL url = new URL(IMailConstant.ROUTE_WEB_STATE);  
  47.         InputStream ins = null;  
  48.         try {  
  49.             ins = url.openConnection().getInputStream();  
  50.             BufferedReader reader = new BufferedReader(new InputStreamReader(ins));  
  51.             String str;  
  52.             boolean flag = false;  
  53.             StringBuffer wanPacket = new StringBuffer();  
  54.             int num = 3;  
  55.             while ((str = reader.readLine()) != null && num > 0) {  
  56.                 if (str.contains("var wanPara = new Array(")) {  
  57.                     flag = true;  
  58.                 }  
  59.                 if (flag) {  
  60.                     wanPacket.append(str);  
  61.                     num--;  
  62.                 }  
  63.             }  
  64.             return wanPacket;  
  65.         }finally{  
  66.             if(ins!=null){  
  67.                 ins.close();  
  68.             }  
  69.         }  
  70.     }  
  71.   
  72.     private String getFirstIp(StringBuffer wanPacket) {  
  73.         // 找出数据包中第一个匹配的IP,即为Ip  
  74.         Pattern p = Pattern.compile("\\d+\\.\\d+\\.\\d+\\.\\d+");  
  75.         Matcher m = p.matcher(wanPacket);  
  76.         if (m.find()) {  
  77.             return m.group();  
  78.         } else {  
  79.             return null;  
  80.         }  
  81.     }  
  82.       
  83.     public static void main(String[] args) {  
  84.         try {  
  85.             System.out.println(RouteIpUtils.getInstance().getRouteIp());  
  86.         } catch (IOException e) {  
  87.             // TODO Auto-generated catch block  
  88.             e.printStackTrace();  
  89.         }  
  90.     }  
  91. }  
Java代码  收藏代码
  1. package com.eehome.app.mail;  
  2.   
  3. public interface IMailConstant {  
  4.   
  5.     /** 
  6.      * 发件人地址 
  7.      */  
  8.     public final static String NOTIFY_EMAIL_MESSAGE_FROM = "wensong1987@126.com";  
  9.   
  10.     /** 
  11.      * 提醒邮件标题前缀 
  12.      */  
  13.     public final static String NOTIFY_EMAIL_MESSAGE_PRE_TITLE = "通知:服务器IP提醒————";  
  14.   
  15.     /** 
  16.      * 路由用户名 
  17.      */  
  18.     public final static String ROUTE_USER = "admin";  
  19.   
  20.     /** 
  21.      * 路由密码 
  22.      */  
  23.     public final static String ROUTE_PWD = "huang";  
  24.   
  25.     /** 
  26.      * 路由Web记录状态的页面,里面包含了Wan口ip 
  27.      */  
  28.     public final static String ROUTE_WEB_STATE = "http://192.168.1.1:83/userRpm/StatusRpm.htm?Connect=连 接&wan=1";  
  29.   
  30.     /** 
  31.      * 轮询时间 10分钟 
  32.      */  
  33.     public final static long POLLING_TIME = 10 * 60 * 1000;  
  34.   
  35.     /** 
  36.      * email文件地址 
  37.      */  
  38.     public final static String EMAIL_FILE_PATH = "/root/mail/mail.txt";  
  39.   
  40.     /** 
  41.      * log4j存放地址 
  42.      */  
  43.     public final static String LOG4J_FILE_PATH = "/root/mail/log/log4j.properties";  
  44.   
  45.     /** 
  46.      * 匹配email的正则 
  47.      */  
  48.     public final static String EMAIL_REG = "[A-Za-z0-9](?:[0-9a-zA-Z_]?\\.?){4,24}@[0-9a-zA-Z_-]{1,59}\\.(?:[0-9a-zA-Z]\\.?[0-9a-zA-Z]?){2,3}";  
  49. }  
Java代码  收藏代码
  1. package com.eehome.app.mail.model;  
  2.   
  3. import java.net.Authenticator;  
  4. import java.net.PasswordAuthentication;  
  5.   
  6. import com.eehome.app.mail.IMailConstant;  
  7.   
  8.   
  9. public class RouterPassAuth extends Authenticator {  
  10.       
  11.     @Override  
  12.     public PasswordAuthentication getPasswordAuthentication() {  
  13.         return new PasswordAuthentication(IMailConstant.ROUTE_USER,  
  14.                 IMailConstant.ROUTE_PWD.toCharArray());  
  15.     }  
  16.   
  17. }  

      考虑到路由IP是动态IP,过一段时间就会变化,我给程序设计了一个轮询机制来检测IP,变化,用一个调度任务来定时获取IP,进行比较,再决定是否发送邮件。

Java代码  收藏代码
  1. package com.eehome.app.mail.task;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.Arrays;  
  5.   
  6. import org.apache.commons.logging.Log;  
  7. import org.apache.commons.logging.LogFactory;  
  8. import org.apache

抱歉!评论已关闭.