1. 程式人生 > >java獲取本地區域網的外網IP ....

java獲取本地區域網的外網IP ....

近日為了滿足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. import java.io.BufferedReader;  
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.InputStreamReader;  
  6. import java.net.Authenticator;  
  7. import java.net.URL;  
  8. import java.util.regex.Matcher;  
  9. import java.util.regex.Pattern;  
  10. import com.eehome.app.mail.IMailConstant;  
  11. import com.eehome.app.mail.model.RouterPassAuth;  
  12. /** 
  13.  * @author wensong 
  14.  * 2010-9-4 下午03:34:58 
  15.  */  
  16. public class RouteIpUtils {  
  17.     private final static RouteIpUtils routeIpUtils = new RouteIpUtils();  
  18.     private RouteIpUtils() {  
  19.     }  
  20.     public
     static RouteIpUtils getInstance() {  
  21.         //驗證器工具的例項進行註冊  
  22.         Authenticator.setDefault(new RouterPassAuth());  
  23.         return routeIpUtils;  
  24.     }  
  25.     public String getRouteIp() throws IOException {  
  26.         StringBuffer wanPacket = getWanPacket();  
  27.         return getFirstIp(wanPacket);  
  28.     }  
  29.     /** 
  30.      * 獲得路由Web中的狀態頁面上的資料 
  31.      *  
  32.      * @return 
  33.      * @throws IOException 
  34.      */  
  35.     private StringBuffer getWanPacket() throws IOException {  
  36.         URL url = new URL(IMailConstant.ROUTE_WEB_STATE);  
  37.         InputStream ins = null;  
  38.         try {  
  39.             ins = url.openConnection().getInputStream();  
  40.             BufferedReader reader = new BufferedReader(new InputStreamReader(ins));  
  41.             String str;  
  42.             boolean flag = false;  
  43.             StringBuffer wanPacket = new StringBuffer();  
  44.             int num = 3;  
  45.             while ((str = reader.readLine()) != null && num > 0) {  
  46.                 if (str.contains("var wanPara = new Array(")) {  
  47.                     flag = true;  
  48.                 }  
  49.                 if (flag) {  
  50.                     wanPacket.append(str);  
  51.                     num--;  
  52.                 }  
  53.             }  
  54.             return wanPacket;  
  55.         }finally{  
  56.             if(ins!=null){  
  57.                 ins.close();  
  58.             }  
  59.         }  
  60.     }  
  61.     private String getFirstIp(StringBuffer wanPacket) {  
  62.         // 找出資料包中第一個匹配的IP,即為Ip  
  63.         Pattern p = Pattern.compile("\\d+\\.\\d+\\.\\d+\\.\\d+");  
  64.         Matcher m = p.matcher(wanPacket);  
  65.         if (m.find()) {  
  66.             return m.group();  
  67.         } else {  
  68.             return null;  
  69.         }  
  70.     }  
  71.     public static void main(String[] args) {  
  72.         try {  
  73.             System.out.println(RouteIpUtils.getInstance().getRouteIp());  
  74.         } catch (IOException e) {  
  75.             // TODO Auto-generated catch block  
  76.             e.printStackTrace();  
  77.         }  
  78.     }  
  79. }  
Java程式碼  收藏程式碼
  1. package com.eehome.app.mail;  
  2. public interface IMailConstant {  
  3.     /** 
  4.      * 發件人地址 
  5.      */  
  6.     public final static String NOTIFY_EMAIL_MESSAGE_FROM = "[email protected]";  
  7.     /** 
  8.      * 提醒郵件標題字首 
  9.      */  
  10.     public final static String NOTIFY_EMAIL_MESSAGE_PRE_TITLE = "通知:伺服器IP提醒————";  
  11.     /** 
  12.      * 路由使用者名稱 
  13.      */  
  14.     public final static String ROUTE_USER = "admin";  
  15.     /** 
  16.      * 路由密碼 
  17.      */  
  18.     public final static String ROUTE_PWD = "huang";  
  19.     /** 
  20.      * 路由Web記錄狀態的頁面,裡面包含了Wan口ip 
  21.      */  
  22.     public final static String ROUTE_WEB_STATE = "http://192.168.1.1:83/userRpm/StatusRpm.htm?Connect=連 接&wan=1";  
  23.     /** 
  24.      * 輪詢時間 10分鐘 
  25.      */  
  26.     public final static long POLLING_TIME = 10 * 60 * 1000;  
  27.     /** 
  28.      * email檔案地址 
  29.      */  
  30.     public final static String EMAIL_FILE_PATH = "/root/mail/mail.txt";  
  31.     /** 
  32.      * log4j存放地址 
  33.      */  
  34.     public final static String LOG4J_FILE_PATH = "/root/mail/log/log4j.properties";  
  35.     /** 
  36.      * 匹配email的正則 
  37.      */  
  38.     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}";  
  39. }  
Java程式碼  收藏程式碼
  1. package com.eehome.app.mail.model;  
  2. import java.net.Authenticator;  
  3. import java.net.PasswordAuthentication;  
  4. import com.eehome.app.mail.IMailConstant;  
  5. public class RouterPassAuth extends Authenticator {  
  6.     @Override  
  7.     public PasswordAuthentication getPasswordAuthentication() {  
  8.         return new PasswordAuthentication(IMailConstant.ROUTE_USER,  
  9.                 IMailConstant.ROUTE_PWD.toCharArray());  
  10.     }  
  11. }  

      考慮到路由IP是動態IP,過一段時間就會變化,我給程式設計了一個輪詢機制來檢測IP,變化,用一個排程任務來定時獲取IP,進行比較,再決定是否傳送郵件。

Java程式碼  收藏程式碼
  1. package com.eehome.app.mail.task;  
  2. import java.io.IOException;  
  3. import java.util.Arrays;  
  4. import org.apache.commons.logging.Log;  
  5. import org.apache.commons.logging.LogFactory;  
  6. import org.apache.log4j.PropertyConfigurator;  
  7. import org.springframework.beans.factory.BeanFactory;  
  8. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  9. import org.springframework.mail.javamail.JavaMailSender;  
  10. import com.eehome.app.mail.IMailConstant;  
  11. import com.eehome.app.mail.model.IpNotifyMessage;  
  12. import com.eehome.app.mail.utils.RouteIpUtils;  
  13. /** 
  14.  * 郵件提醒任務 
  15.  * @author wensong 
  16.  * 2010-9-5 下午11:12:17 
  17.  */  
  18. public class NotifyEmailSendTask implements Runnable {  
  19.     private String[] toMails;  
  20.     private Log logger = LogFactory.getLog(this.getClass());  
  21.     private static String ip = "192.168.1.110";  
  22.     static {  
  23.         PropertyConfigurator.configure(IMailConstant.LOG4J_FILE_PATH);  
  24.     }  
  25.     

    相關推薦

    java 獲取本地機器IP地址

    package org.shuochen.test.network; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumer

    java獲取本地區域網IP ....

    近日為了滿足2個屋子裡人的通訊需要,需要將本地的外網IP告訴給另一個屋子裡的人。以前都是在群裡喊一句,我這裡的IP是XXXX,有一天自己突發奇想,想通過程式來實現這個自動化通知的過程。於是自己給自己定了需求。       需求:基本目標實現開機將本地的路由WAN

    java web獲取客戶端ip和所在區域

    @參考文章1、@參考文章2、@參考文章3、@參考文章4,@之前同事的專案  controller @Controller @RequestMapping("/home") public class HomeController { @RequestMappin

    通過JS獲取真實的IP和內IP以及IPv6地址

    由於需求需要獲取到本機ip地址,查了半天相關只是不知所云,最後偶然得已法,遂試,果然ok,直接看下文。 通過JS獲取你真實的外網IP和內網IP以及IPv6地址,就算開代理也沒有用,想想真是太6,還能不能愉快的裝逼了,效果如下:

    Android 獲取當前裝置IP以及DNS.

    如題,最近做個專案,需要獲取當前裝置IP地址和DNS地址.但是按照Android提供的方法獲取的都是內網.網易提供了一個解決方案:請求地址:http://xx.nstool.netease.comxx為當前格林威治時間,請求返回結果是一個html內容,需要解析中間的src欄位

    java 獲取本地系統IPIP

    public static void main(String[] args) { try { InetAddress address = InetAddress.getLocalHost();//獲取的是本地的IP地址 //PC-20140317PXKX/192.168.0.121

    java 獲取本機的公網、ip

    本機通過路由器聯網,獲取ip時獲取的是路由器分配的IP。 獲取公網的IP: 檢查元素,可以獲得一個地址 直接訪問這個網站進行擷取 import java.io.BufferedReader; import java.io.IOException; import ja

    Linux環境下java後臺獲取IP

    專案測試時有測試ip,之後給分配公網ip.那麼怎麼獲取公網ip呢 通過一個網路代理去獲取對應的資訊,返回的是一個Json,需要建立一個類接收,之後在取出來 程式碼 接收的類 import jav

    java程式碼實現IP獲取

    private static String getMyIP() throws IOException { InputStream ins = null; try { String l = "http://1

    java獲取本機名稱、IP、MAC地址和卡名稱

    sans mon any flex exc consola 獲取本地ip network log java獲取本機名稱、IP、MAC地址和網卡名稱摘自:https://blog.csdn.net/Dai_Haijiao/article/details/80364370 20

    Linux C++ 區域網訪問ip、埠之iptables配置

    第一步:安裝iptables yum install -y iptables yum install -y iptables-services 第二步:配置埠對映 1.將所有網段轉發至路由機公網ip(動態): iptables -t nat -A POSTROUTING -o e

    教你用shell指令碼在Linux上獲取IP地址

    基於Linux系統的獲取外網IP地址的shell指令碼,指令碼內容如下: getIp.sh #!/bin/bash #檢查IP的合法性 check_ipaddr() { echo $1|grep "^[0-9]\{1,3\}\.\([0-9]\{1,3\}\.\)\{2\}

    Java獲取本地IP地址

    import java.net.*; publicclass ip5 { publicstaticvoid main(String args[]) throws Exception { String ip = InetAddress.getLoc

    動態獲取樹莓派的變動ip

    ip變化時發郵件通知 在此目錄下建立 /home/config.py 配置郵箱資訊 #!/usr/bin/env python #-*-coding:utf-8-*- smtpServer='smtp.126.com' #郵件傳送帳戶的smtp伺服器地址 s

    VC++獲取IP的幾個方法

    一、CHttpFile方式 #include <afxinet.h> int GetNetIp(char *IpAddr) { try  {   CInternetSession session("HttpClient");   char * url = "ht

    c++ 獲取ip地址

    // 外部呼叫 ============================================== networkip.GetLocalIP(); string retip = networkip.GetInternetIP(); // 封裝實現 =======

    android 根據網路來獲取ip地址及國家,地區的介面

    新浪的IP地址查詢介面:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 新浪多地域測試方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?form

    Java獲取本地IP和計算機名

    package com.bjsxt.base.bhz.nio.test; import java.net.InetAddress; import java.net.UnknownHostException; public class Test {public static

    java獲取本地IP和伺服器IP

    java獲取IP地址 最近公司在做日誌報警服務,並將異常資訊推送到簡聊,需要在異常資訊上新增IP地址,用於快速定位異常位置。總結以下知識點: 獲取本地IP地址 String address = InetAddress.getLocalHost().ge

    獲取本機的IP地址

    {   Uri uri =new Uri("http://www.ikaka.com/ip/index.asp");//查本機網路IP的網頁   HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);   req.Method ="POST";