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算是被我搞出來了。
- package com.eehome.app.mail.utils;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.net.Authenticator;
- import java.net.URL;
- import java.util.regex.Matcher;
-
import java.util.regex.Pattern;
- import com.eehome.app.mail.IMailConstant;
- import com.eehome.app.mail.model.RouterPassAuth;
- /**
- * @author wensong
- * 2010-9-4 下午03:34:58
- */
- public class RouteIpUtils {
- private final static RouteIpUtils routeIpUtils = new RouteIpUtils();
- private RouteIpUtils() {
- }
-
public
- //驗證器工具的例項進行註冊
- Authenticator.setDefault(new RouterPassAuth());
- return routeIpUtils;
- }
- public String getRouteIp() throws IOException {
- StringBuffer wanPacket = getWanPacket();
- return getFirstIp(wanPacket);
- }
- /**
- * 獲得路由Web中的狀態頁面上的資料
- *
- * @return
- * @throws IOException
- */
- private StringBuffer getWanPacket() throws IOException {
- URL url = new URL(IMailConstant.ROUTE_WEB_STATE);
- InputStream ins = null;
- try {
- ins = url.openConnection().getInputStream();
- BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
- String str;
- boolean flag = false;
- StringBuffer wanPacket = new StringBuffer();
- int num = 3;
- while ((str = reader.readLine()) != null && num > 0) {
- if (str.contains("var wanPara = new Array(")) {
- flag = true;
- }
- if (flag) {
- wanPacket.append(str);
- num--;
- }
- }
- return wanPacket;
- }finally{
- if(ins!=null){
- ins.close();
- }
- }
- }
- private String getFirstIp(StringBuffer wanPacket) {
- // 找出資料包中第一個匹配的IP,即為Ip
- Pattern p = Pattern.compile("\\d+\\.\\d+\\.\\d+\\.\\d+");
- Matcher m = p.matcher(wanPacket);
- if (m.find()) {
- return m.group();
- } else {
- return null;
- }
- }
- public static void main(String[] args) {
- try {
- System.out.println(RouteIpUtils.getInstance().getRouteIp());
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- package com.eehome.app.mail;
- public interface IMailConstant {
- /**
- * 發件人地址
- */
- public final static String NOTIFY_EMAIL_MESSAGE_FROM = "[email protected]";
- /**
- * 提醒郵件標題字首
- */
- public final static String NOTIFY_EMAIL_MESSAGE_PRE_TITLE = "通知:伺服器IP提醒————";
- /**
- * 路由使用者名稱
- */
- public final static String ROUTE_USER = "admin";
- /**
- * 路由密碼
- */
- public final static String ROUTE_PWD = "huang";
- /**
- * 路由Web記錄狀態的頁面,裡面包含了Wan口ip
- */
- public final static String ROUTE_WEB_STATE = "http://192.168.1.1:83/userRpm/StatusRpm.htm?Connect=連 接&wan=1";
- /**
- * 輪詢時間 10分鐘
- */
- public final static long POLLING_TIME = 10 * 60 * 1000;
- /**
- * email檔案地址
- */
- public final static String EMAIL_FILE_PATH = "/root/mail/mail.txt";
- /**
- * log4j存放地址
- */
- public final static String LOG4J_FILE_PATH = "/root/mail/log/log4j.properties";
- /**
- * 匹配email的正則
- */
- 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}";
- }
- package com.eehome.app.mail.model;
- import java.net.Authenticator;
- import java.net.PasswordAuthentication;
- import com.eehome.app.mail.IMailConstant;
- public class RouterPassAuth extends Authenticator {
- @Override
- public PasswordAuthentication getPasswordAuthentication() {
- return new PasswordAuthentication(IMailConstant.ROUTE_USER,
- IMailConstant.ROUTE_PWD.toCharArray());
- }
- }
考慮到路由IP是動態IP,過一段時間就會變化,我給程式設計了一個輪詢機制來檢測IP,變化,用一個排程任務來定時獲取IP,進行比較,再決定是否傳送郵件。
Java程式碼- package com.eehome.app.mail.task;
- import java.io.IOException;
- import java.util.Arrays;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.apache.log4j.PropertyConfigurator;
- import org.springframework.beans.factory.BeanFactory;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import org.springframework.mail.javamail.JavaMailSender;
- import com.eehome.app.mail.IMailConstant;
- import com.eehome.app.mail.model.IpNotifyMessage;
- import com.eehome.app.mail.utils.RouteIpUtils;
- /**
- * 郵件提醒任務
- * @author wensong
- * 2010-9-5 下午11:12:17
- */
- public class NotifyEmailSendTask implements Runnable {
- private String[] toMails;
- private Log logger = LogFactory.getLog(this.getClass());
- private static String ip = "192.168.1.110";
- static {
- PropertyConfigurator.configure(IMailConstant.LOG4J_FILE_PATH);
- }
-
相關推薦
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 獲取本地系統IP 及網咯IP
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";