1.简介
IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础。InetAddress是Java对IP地址的封装,在java.net中有许多类都使用到了InetAddress,包括ServerSocket,Socket,DatagramSocket等等。
InetAddress的实例对象包含以数字形式保存的IP地址,同时还可能包含主机名(如果使用主机名来获取InetAddress的实例,或者使用数字来构造,并且启用了反向主机名解析的功能)。InetAddress类提供了将主机名解析为IP地址(或反之)的方法。
InetAddress对域名进行解析是使用本地机器配置或者网络命名服务(如域名系统(Domain Name System,DNS)和网络信息服务(Network Information Service,NIS))来实现。对于DNS来说,本地需要向DNS服务器发送查询的请求,然后服务器根据一系列的操作,返回对应的IP地址,为了提高效率,通常本地会缓存一些主机名与IP地址的映射,这样访问相同的地址,就不需要重复发送DNS请求了。在java.net.InetAddress类同样采用了这种策略。在默认情况下,会缓存一段有限时间的映射,对于主机名解析不成功的结果,会缓存非常短的时间(10秒)来提高性能。
2.InetAddress对象的获取
InetAddress的构造函数不是公开的(public),所以需要通过它提供的静态方法来获取,有以下的方法:
static InetAddress[] getAllByName(String host)
static InetAddress getByAddress(byte[] addr)
static InetAddress getByAddress(String host,byte[] addr)
static InetAddress getByName(String host)
static InetAddress getLocalHost()
在这些静态方法中,最为常用的应该是getByName(String host)方法,只需要传入目标主机的名字,InetAddress会尝试做连接DNS服务器,并且获取IP地址的操作。代码片段如下,注意我们假设以下的代码,都是默认导入了java.net中的包,在程序的开头加上import java.net.*,否则需要指定类的全名java.net.InetAddress。
InetAddress address=InetAddress.getByName("www.baidu.com");
注意到这些方法可能会抛出的异常。如果安全管理器不允许访问DNS服务器或禁止网络连接,SecurityException会抛出,如果找不到对应主机的IP地址,或者发生其他网络I/O错误,这些方法会抛出UnknowHostException。所以需要写如下的代码:
try { InetAddress address=InetAddress.getByName("www.baidu.com"); System.out.println(address); } catch(UnknownHostException e) { e.printStackTrace(); }
下面是一则完整的例子:
import java.net.InetAddress; /** * this example is used to show how to get InetAddress instance * * @author Dakiler */ public class Example1 { public static void main(String args[]) throws Exception { InetAddress address = InetAddress.getByName("www.baidu.com"); System.out.println(address); System.out.println("-----"); InetAddress[] addresses = InetAddress.getAllByName("www.baidu.com"); for (InetAddress addr : addresses) { System.out.println(addr); } } }
运行结果如下:
-----
在这个例子中,我们使用到了getByName()以及getAllByName()两个方法,前者通过"www.baidu.com"来获取InetAddress的对象,并且输出到控制台。System.out.println(address); 默认调用了InetAddress.toString()方法,在结果中可以看到"www.baidu.com/119.75.213.61"的输出结果,其中119.75.213.61为百度网站的IP地址。
getAllByName()方法是根据主机名返回其可能的所有InetAddress对象,保存在一个数组中。在这个例子中,输出的结果中,www.baidu.com有两个ip地址分别为119.75.213.61以及119.75.216.30。
另外一个静态常用的静态方法是getLocalHost(),返回的是本地地址,如下例:
import java.net.InetAddress; public class Example2 { public static void main(String args[])throws Exception { InetAddress address=InetAddress.getLocalHost(); System.out.println(address); } }
这个例子首先是根据InetAddress.getLocalHost()方法获取本地IP地址,然后通过System.out.println()打印出来,结果如下:
dakiler/192.168.1.102
Source:http://www.cnblogs.com/hnrainll/archive/2012/01/09/2317515.html
相关推荐
import java.net.*; import java.io.*; public class udptest { ///创建一个数据包套接字对象ds,并且指定连接的端口号 ///创建一个数据包对象dp ///指定一个字节数组,用来存储接受的数据 public static void ...
java.net.InetAddress 类包装器。 用法 获取主机的 IP 地址,给定主机名: => (by-name "github.com") # 获取本地主机地址: => (localhost) # 检查地址地址是否可达: => (reachable? (by-name "server-in-...
import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.sql.Time; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing....
import java.net.InetAddress; import java.net.UnknownHostException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java....
33. import java.net.InetAddress; 34. import java.net.SocketException; 35. import java.net.UnknownHostException; 36. import java.util.Date; 37. import java.util.Scanner; 38. import java.util.Stack...
Android中socket通信简单实现 socket通信需要有一个服务器和客户端,可以把同一个APP作为服务器跟客户端,也可以分开成两个APP。...import java.net.InetAddress; import java.net.ServerSocket; import java.net.So
获取计算机的mac地址和ip地址,mac地址返回的是一个list,ip地址是string
import java.net.InetAddress;import java.net.Socket;public class SimpleHttpClientUsingSocket {public static void main(String[] args) {String host = null;if (args.length > 0) {host = args[0];} else {...
new TCPClient(bufOut.toByteArray(), InetAddress.getLocalHost(), 1211); break; } else { bufOut.write(buf, 0, len); } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch ...
是一个可以用java的基本类java.net.InetAddress做的程序实例
import java.net.InetAddress; import java.util.Arrays; import jpcap.*; import jpcap.packet.*; public class ARP { public static byte[] arp(InetAddress ip) throws java.io.IOException{ //发现本机器的...
import java.net.InetAddress; import java.net.UnknownHostException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import net.sf.json.JSONArray; import org...
网络编程(TCP) TCP需要连接(三次握手)。发送端也称客户端,接收端...import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; /* * Socket(InetAddress address, int port)
import java.net.*; import java.util.*; public class Server { public static void main(String args[]){ try { ServerSocket server = new ServerSocket(8888); System.out.println("服务器在监听8888端口...");...
在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类java.net.Socket.,使得编写网络应用程序相对容易.服务器采用多线程以满足多用户的请求,通过JDBC与后台数据库连接,并通过创建一个...
import java.net.InetAddress; /* 流程: 1. 创建UDP服务器对应的发送端Socket 2. 准备对应数据包,需要带有指定数据 3. 发送数据 send 4. 关闭UDP发送端 */ public class SenderDemo1 { public static void ...
import java.net.*; /** * * @author Administrator *@version 1.0 *BackupClient类实现文件的传输到服务器 */ public class BackupClient implements Runnable{ private int port;//服务器端口 private ...
客户端软件通常使用java.net包中的核心类Socket与服务器的某个端口建立连接,而服务器程序不同于客户机,它需要初始化一个端口进行监听,遇到连接呼叫,才与相应的客户机建立连接。Java.net包的ServerSocket类包含了...
在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类 java.net.Socket.,使得编写网络应用程序相对容易.服务器采用多线程以满足多用户的请求,通过JDBC与后台数据库连接,并通过创建一个 ...