如何通过自己的ADSL使家里的电脑成为服务器呢?像花生壳这样的应用可以帮助你动态解析ip,不过这个程序太庞大了,根本没有必要。
下面介绍我的做法:
条件:
上网方式:ADSL
台式机:linux
中继网页:在某虚拟主机申请一个免费空间,需要支持动态脚本(php、jsp等)
方案:
在本机运行一个Java程序,定时读取本机的外网IP,自动向中继网页用GET方式提交该数据。中继网页保存IP记录在内存中,其他访问者可以通过该页面查看当前的IP。
package
tedeyang;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class UpdateIp {
static String page = " http://xxx.xxx.com/name/link.jsp?ip= " ; // need 'ip='
static String strategy = " ifconfig " ; // or jdk
static long refreshTime = 5L * 60 * 1000 ; // 5 minutes
/** */ /**
* @param args
* @throws IOException
*/
public static void main( final String[] args) throws IOException {
if (args.length <= 1 ) {
System.out.println( " Parameter error ! " );
System.out
.println( " should be followed by three parameters : updatePage ipStrategy refreshMinutes, at least updatePage " );
System.out.println( " updatePage likes 'http://host/xxx.jsp?ip=' " );
System.out.println( " ipStrategy maybe is jdk or ifconfig,default is ifconfig " );
System.out.println( " refreshMinutes 's unit is minute, default is 5 minutes " );
return ;
}
page = args[ 0 ];
if ( ! page.endsWith( " ip= " ))
page += " ?ip= " ; // ?
strategy = args[ 1 ];
try {
refreshTime = Integer.parseInt(args[ 2 ]);
refreshTime *= 60 * 1000 ;
} catch (Exception e) {
}
// cycle
final Timer t = new Timer();
t.schedule( new TimerTask() {
public void run() {
try {
UpdateIp.run(page, strategy);
} catch (IOException e) {
e.printStackTrace();
// t.cancel();
}
} ;
} , 0 , refreshTime);
}
private static void run(String page, String ipStrategy) throws IOException {
String ip = " no " ;
if (ipStrategy.equals( " jvm " ))
ip = getIpByJavaApi();
else
ip = getIpByLinuxIfconfig();
System.out.print( new Date() + " , this ip is : " + ip);
touchIp(page, ip);
System.out.println( " , touch successed. " );
}
private static void touchIp(String page, String ip) throws IOException {
URL url = null ;
url = new URL(page + ip);
URLConnection con = null ;
BufferedReader reader = null ;
try {
con = url.openConnection();
con.connect();
reader = new BufferedReader( new InputStreamReader(con.getInputStream()));
reader.readLine();
} finally {
try {
reader.close();
con = null ;
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static String getIpByJavaApi() throws UnknownHostException {
String ip = " none " ;
InetAddress[] all = InetAddress.getAllByName(InetAddress.getLocalHost()
.getHostName());
// 通过本机主机名,遍历多个ip
for ( int i = 0 ; i < all.length; i ++ ) {
String ip2 = all[i].getHostAddress();
if ( ! ip2.startsWith( " 127. " ) && ! ip2.startsWith( " 192. " )
&& ! ip2.startsWith( " 10. " ) && ! ip2.startsWith( " 172. " )) {
ip = ip2;
}
}
return ip;
}
private static String getIpByLinuxIfconfig() throws IOException {
String ip = " none " ;
Process pre = Runtime.getRuntime().exec(
new String[] { " sh " , " -c " , " ifconfig ppp0 | grep addr " } );
BufferedReader reader = null ;
try {
reader = new BufferedReader( new InputStreamReader(pre
.getInputStream()));
String line = reader.readLine();
if (line != null && line.matches( " .*addr.* " )) {
int s = line.indexOf( " addr: " ) + 5 ;
int e = line.indexOf( " " , s);
ip = line.substring(s, e).trim();
}
} finally {
if (reader != null )
reader.close();
}
return ip;
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class UpdateIp {
static String page = " http://xxx.xxx.com/name/link.jsp?ip= " ; // need 'ip='
static String strategy = " ifconfig " ; // or jdk
static long refreshTime = 5L * 60 * 1000 ; // 5 minutes
/** */ /**
* @param args
* @throws IOException
*/
public static void main( final String[] args) throws IOException {
if (args.length <= 1 ) {
System.out.println( " Parameter error ! " );
System.out
.println( " should be followed by three parameters : updatePage ipStrategy refreshMinutes, at least updatePage " );
System.out.println( " updatePage likes 'http://host/xxx.jsp?ip=' " );
System.out.println( " ipStrategy maybe is jdk or ifconfig,default is ifconfig " );
System.out.println( " refreshMinutes 's unit is minute, default is 5 minutes " );
return ;
}
page = args[ 0 ];
if ( ! page.endsWith( " ip= " ))
page += " ?ip= " ; // ?
strategy = args[ 1 ];
try {
refreshTime = Integer.parseInt(args[ 2 ]);
refreshTime *= 60 * 1000 ;
} catch (Exception e) {
}
// cycle
final Timer t = new Timer();
t.schedule( new TimerTask() {
public void run() {
try {
UpdateIp.run(page, strategy);
} catch (IOException e) {
e.printStackTrace();
// t.cancel();
}
} ;
} , 0 , refreshTime);
}
private static void run(String page, String ipStrategy) throws IOException {
String ip = " no " ;
if (ipStrategy.equals( " jvm " ))
ip = getIpByJavaApi();
else
ip = getIpByLinuxIfconfig();
System.out.print( new Date() + " , this ip is : " + ip);
touchIp(page, ip);
System.out.println( " , touch successed. " );
}
private static void touchIp(String page, String ip) throws IOException {
URL url = null ;
url = new URL(page + ip);
URLConnection con = null ;
BufferedReader reader = null ;
try {
con = url.openConnection();
con.connect();
reader = new BufferedReader( new InputStreamReader(con.getInputStream()));
reader.readLine();
} finally {
try {
reader.close();
con = null ;
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static String getIpByJavaApi() throws UnknownHostException {
String ip = " none " ;
InetAddress[] all = InetAddress.getAllByName(InetAddress.getLocalHost()
.getHostName());
// 通过本机主机名,遍历多个ip
for ( int i = 0 ; i < all.length; i ++ ) {
String ip2 = all[i].getHostAddress();
if ( ! ip2.startsWith( " 127. " ) && ! ip2.startsWith( " 192. " )
&& ! ip2.startsWith( " 10. " ) && ! ip2.startsWith( " 172. " )) {
ip = ip2;
}
}
return ip;
}
private static String getIpByLinuxIfconfig() throws IOException {
String ip = " none " ;
Process pre = Runtime.getRuntime().exec(
new String[] { " sh " , " -c " , " ifconfig ppp0 | grep addr " } );
BufferedReader reader = null ;
try {
reader = new BufferedReader( new InputStreamReader(pre
.getInputStream()));
String line = reader.readLine();
if (line != null && line.matches( " .*addr.* " )) {
int s = line.indexOf( " addr: " ) + 5 ;
int e = line.indexOf( " " , s);
ip = line.substring(s, e).trim();
}
} finally {
if (reader != null )
reader.close();
}
return ip;
}
}
<%!
static String ip = " none " ;
static List record = new ArrayList();
%><%
String ipa = request.getParameter( " ip " );
if (record.size() > 100 ) {
record.clear();
}
if (ipa != null ) {
if (ipa.equals( " ask " )) {
Iterator it = record.iterator();
while (it.hasNext()) {
out.println(it.next() + " </br> " );
}
} else {
this .ip = ipa;
record.add(ipa + " " + new java.util.Date().getTime());
}
}
out.print( " ip= " + ip);
%>
static String ip = " none " ;
static List record = new ArrayList();
%><%
String ipa = request.getParameter( " ip " );
if (record.size() > 100 ) {
record.clear();
}
if (ipa != null ) {
if (ipa.equals( " ask " )) {
Iterator it = record.iterator();
while (it.hasNext()) {
out.println(it.next() + " </br> " );
}
} else {
this .ip = ipa;
record.add(ipa + " " + new java.util.Date().getTime());
}
}
out.print( " ip= " + ip);
%>