a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 262|回复: 1

[其他] JAVA技巧:PING和TELNET用法介绍

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
JAVA里的PING是在JDK 1.5后用了新的函数isreachable去实现,具体介绍如下:   InetAddress对象的常用方法
7 S+ y" F# U) h0 M: U, l  InetAddress类有很多get方法,用来获取主机名,主机地址等信息。主要有:
+ ?# p4 _  y* c4 M* ]- r4 ?  byte[] getAddress() 返回次InetAddress对象的原始IP地址,保存为一个byte数组2 y2 ]- m( ^& V& ]7 o* m" g2 S
  String getCanonicalHostName() 获取此IP地址的完全限定域名1 _/ N, g, `, }" B& h1 d
  String getHostAddress() 获取IP地址的字符串,返回为一个String4 `' S% _- b) H5 p! \. c& O
  String getHostName() 获取此IP地址的主机名  ^& L9 Z+ v( e  A& W; _/ p. I9 n9 I
  下面一个简单的例子展示这些方法的使用:
' V& B/ |4 k; A' E0 Q1 r! u, Z4 i5 t4 Z
# ]) b2 P# K/ E1 K' [: x
   package org.dakiler.javanet.chapter1;
+ x5 D4 u( K- ~) ]  import java.net.InetAddress;
, `3 F  _. e- [8 ^+ V. j  public class Example3 - G* ~: l; l( Q, K" ?( L. {
  {
* n0 X( N! z, A# M0 L  public static void main(String args[])throws Exception ( n" H, w3 j8 ?4 I- v8 i
  { * i* H" z4 E# H7 k/ L
  InetAddress address=InetAddress.getByName("www.microsoft.com"); & J5 g, n/ u) V8 Q. a& p% `: A
  System.out.println("ip: "+address.getHostAddress());
3 N: y9 @2 {  \3 o1 u9 J9 q. P  System.out.println("host: "+address.getHostName()); 5 Y" g# I& p+ Q
  System.out.println("canonical host name: "+address.getCanonicalHostName());
- b$ q0 l8 O7 G7 H  byte[] bytes=address.getAddress(); # F  ?% r+ V4 ?* a1 i
  for(byte b:bytes)
4 E9 ?( w8 h$ j: Y6 a2 t) O  {
8 f2 h5 O4 Y/ X! \1 V% n5 @  if(b>=0)System.out.print(b); . u  J9 u5 c# X! {: j7 i* }1 D
  else System.out.print(256+b);
- p# h0 E3 }( \: r  System.out.print(" ");
9 w" \7 _" f$ Z$ g( Q  }
9 P( b% p# l" e' h: t: p4 U  } ; G# V6 l3 R' F6 w; M/ o
  }  这个例子首先是获取www.microsoft.com的对应的InetAddress实例,然后分别打印 address.getHostAddress() address.getHostName()以及address.getCanonicalHostName()。在这个例子中,需要注意的是IP地址中,每一个都是0-255之间的,是无符号的。但是java中的byte表示的区域是-128~127,所以中间需要做一个转换。
$ q, ?' c  |2 l2 X, w% B; F0 o  结果如下:  i+ P$ `3 m& W* Q1 b

; ^4 ]7 ]8 }# X. O5 \' U% N7 ^/ W! m
3 x, U/ S% K- i) I6 C
    ip: 207.46.19.254
5 G& q  @+ ~0 }- z  host: www.microsoft.com 4 a0 j% Y/ R6 |, ]
  canonical host name: wwwbaytest2.microsoft.com0 a$ J7 L0 ]/ I' _
; V, I/ p2 [! U9 I
  
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:28:24 | 显示全部楼层

JAVA技巧:PING和TELNET用法介绍

207 46 19 254</p>  1.2. InetAddress对象的其他实用方法$ d) G: f' P; V7 w1 e6 ?. P$ M
  isReachable(int timeout) 测试是否能达到特定IP地址7 D* U: Z7 Q  m
  isReachable(NetworkInterface netif,int ttl,int timeout)测试是否能达到特定IP地址,并且制定特定的NetworkInterface,ttl表示路由过程中的最大跳数,timeout是超时时间。一个简单的例子如下:6 r0 C9 Y* K0 k) P" i" S' v

' e( q9 C# q2 a7 u' w# e6 ~( t" ]! [
- F7 A5 }3 p, m' x6 M: t
   package org.dakiler.javanet.chapter1; " s2 _8 M* u6 O& x! H% w4 O$ ~. A& ~
  import java.net.InetAddress; , O* H9 b* U& J$ c" k4 S1 J
  public class Example4 * C0 Q6 h( B8 w/ A
  {
& k# ]1 H8 e% Y# U  public static void main(String args[])throws Exception
2 N$ S+ N- t, \" \: X7 x6 d  {
! m9 j5 M* b: U- _) U; o* {  InetAddress address1=InetAddress.getLocalHost(); 5 M4 x  {9 A$ }& n* U
  InetAddress address2=InetAddress.getByName("www.baidu.com");
$ P# H8 c0 h* e. S! j  System.out.println(address1.isReachable(5000));
* @4 U, e6 o; w) v; H6 B( P  System.out.println(address2.isReachable(5000)); ! ]! T/ K( f0 I6 B- y5 j
  } / w) [" X# q* _' E! V" {
  }# `8 y9 G! U, R" e# {
  分别测试本机是否可达以及www.baidu.com是否可达。运行的结果是:- k' l) l% p; t2 _  p

9 b8 V: _$ n! O% ]$ J- _# E
2 L& y" \/ L# J/ W2 g, \, J
$ f+ L. b; w: h2 W4 R1 k    true 3 f* W5 ?0 K0 R9 D: c
  false) r5 V! m, l" S$ l$ H. ~2 w- N
  感觉奇怪么,前者是正常的,但是按理说www.baidu.com应该也是可达的,实际确实false,这个原因是因为isReachable的实现,通常是ICMP ECHO Request 或是尝试使用目标主机上的端口7进行连接,很有可能被防火墙拦截,所以会访问不到。
4 D* _8 D2 Q. i  如果要TELNET的话,会比较准确,比如以下代码
) G+ K& p; u* f0 m0 O! z& [; U7 N0 A( N1 G6 e' A) C

6 [! t0 |* g1 M* v, |
$ v! w* W& N* u; B" {     // TODO Auto-generated method stub
0 D* F# h( N8 r2 D& o  Socket server = null;
& g1 z9 B" l, O& P; [  try { 9 P5 V- v3 B! r% g- t
  server = new Socket();
  w! j, J2 b2 `& m" D7 [  InetSocketAddress address = new InetSocketAddress("bbs.sysu.edu.cn",23);
! b4 o4 @. X7 m* V9 h  server.connect(address, 5000);
5 l' G7 I- |5 u0 ]5 d/ A  System.out.println("ok!");
4 [( W! y8 n! r1 A# ~( d/ g% G  }
) O  i. r; t' I  catch (UnknownHostException e) { 0 B& I( H* b8 w3 w5 ~( F3 Z# A
  System.out.println("wrong!"); 1 B6 e& v, t" Q6 s" F
  e.printStackTrace(); ' [- S" |8 z) X: I  s! Q
  } catch (IOException e) { $ G; K4 F6 K- y5 j& `$ S6 {, ~
  System.out.println("wrong");
: U& m! F/ M, B4 b& l  e.printStackTrace();
" h  u2 r$ `6 O+ m  }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-16 20:23 , Processed in 0.795929 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表