1. 程式人生 > >[JAVA]PING和TELNET用法介紹

[JAVA]PING和TELNET用法介紹

JAVA裡的PING是在JDK 1.5後用了新的函式isreachable去實現,具體介紹如下:

  InetAddress物件的常用方法

  InetAddress類有很多get方法,用來獲取主機名,主機地址等資訊。主要有:

  byte[] getAddress() 返回次InetAddress物件的原始IP地址,儲存為一個byte陣列

  String getCanonicalHostName() 獲取此IP地址的完全限定域名

  String getHostAddress() 獲取IP地址的字串,返回為一個String

  String getHostName() 獲取此IP地址的主機名

  下面一個簡單的例子展示這些方法的使用:

1 package org.dakiler.javanet.chapter1;
2 import java.net.InetAddress;
3 publicclass Example3
4   {
5 publicstaticvoid main(String args[])throws Exception
6   {
7   InetAddress address=InetAddress.getByName("www.microsoft.com");
8   System.out.println("ip: "+address.getHostAddress());
9   System.out.println("host: "+address.getHostName());
10   System.out.println("canonical host name: "+address.getCanonicalHostName());
11 byte[] bytes=address.getAddress();
12 for(byte b:bytes)
13   {
14 if(b>=0)System.out.print(b);
15 else System.out.print(256+b);
16   System.out.print("");
17   }
18   }
19   }
20

這個例子首先是獲取www.microsoft.com的對應的InetAddress例項,然後分別列印address.getHostAddress()、address.getHostName()

以及address.getCanonicalHostName()。

在這個例子中,需要注意的是IP地址中,每一個都是0-255之間的,是無符號的。

但是java中的byte表示的區域是-128~127,所以中間需要做一個轉換。

  結果如下:

  ip: 207.46.19.254

 host: www.microsoft.com 
 canonical host name: wwwbaytest2.microsoft.com
 207 46 19 254

1.2. InetAddress物件的其他實用方法

  isReachable(int timeout) 測試是否能達到特定IP地址

  isReachable(NetworkInterface netif,int ttl,int timeout)測試是否能達到特定IP地址,

並且制定特定的NetworkInterface,ttl表示路由過程中的最大跳數,timeout是超時時間。

一個簡單的例子如下:

1 package org.dakiler.javanet.chapter1;
2 import java.net.InetAddress;
3 publicclass Example4
4   {
5 publicstaticvoid main(String args[])throws Exception
6   {
7   InetAddress address1=InetAddress.getLocalHost();
8   InetAddress address2=InetAddress.getByName("www.baidu.com");
9   System.out.println(address1.isReachable(5000));
10   System.out.println(address2.isReachable(5000));
11   }
12   }
13 分別測試本機是否可達以及www.baidu.com是否可達。執行的結果是
    true 
  false

  感覺奇怪麼,前者是正常的,但是按理說www.baidu.com應該也是可達的,實際確實false,這個原因是因為isReachable的實現,

通常是ICMP ECHO Request 或是嘗試使用目標主機上的埠7進行連線,很有可能被防火牆攔截,所以會訪問不到。

  如果要TELNET的話,會比較準確,比如以下程式碼


1 // TODO Auto-generated method stub 2   Socket server =null;
3 try {
4   server =new Socket();
5   InetSocketAddress address =new InetSocketAddress("bbs.sysu.edu.cn",23);
6   server.connect(address, 5000);
7   System.out.println("ok!");
8   }
9 catch (UnknownHostException e) {
10   System.out.println("wrong!");
11   e.printStackTrace();
12   } catch (IOException e) {
13   System.out.println("wrong");
14   e.printStackTrace();
15   }