java什么是网络接口_java 网络编程 -- IP地址的表示与网络接口信息的获取(InetAddress和NetworkInterface)...
使用java进行网络程序的开发,可以说是一件令人愉悦的事情,对于用惯了C++网络接口编程的人来说,当他们首次使用Java开发网络应用程序,会发现java开发网络应用是如此的简单,甚至仅用几分钟时间,您就可以学会这种网络编程技术。本章主要对java网络编程相关的知识进行探讨,首先探讨java对于网卡信息获取方式,之后介绍如何使用java编写基于网络的客户端和服务端程序。最后探讨一些java网络相关的高级主题。
3.1 java获取网络通信信息
java为了方便网络编程,提供了表示IP地址的类、表示网络接口(这个接口是指网卡)的类,表示网络连接接口的类。下面主要探讨这些基本的类,以及如何使用这些类来获取网络信息。Graphic3-1给出了与网络通信信息相关的类之间的关系。
Graphic3-1 网络通信信息相关的类
3.1.1 InetAddress类
InetAddress用来表示一个IP地址。可以通过主机名来配置InetAddress,此时InetAddress将会通过主机配置的DNS服务器解析出对应域名的IP地址。对于任何的主机名,InetAddress也可以解析出其对应的IP地址。InetAddress拥有两个子类,分别是Inet4Address和Inet6Address,在大多说情况下都无需直接处理这些子类,因为InetAddress抽象类已经覆盖了大多数必需的功能。Graphic3-2给出了InetAddress的公有操作。从Graphic3-2从可以看出,InetAddress类没有公有的构造方法,要想获取InetAddress的实例必需使用InetAddress内部的一些静态方法(这是设计模式中的简单工厂方法)。
Demo3-1给出了使用InetAddress的基本用法。示例中先使用InetAddress的getLocalHost方法获取了本机的IP地址,然后输出,使用getByName方法获得了google服务器的一个IP地址,由于google服务器有很多服务主机,当前获取的是哪一个服务的主机的IP地址并不确定,实际应用中,这是一个随机的值,这与DNS服务器有直接关系。使用了getByAllName方法可以获取google的所有服务主机名。最后使用了isReachable方法来判断一台主机的可达性。
需要说明的是,使用getLocalHost方法未必真的能够获取您想要的本机的IP地址(有人说,在windows上getLocalHost可以正确执行,获取到本机的IPV4地址,而在Linux上调用getLocalHost返回的是一个127.0.0.1的ip地址)。现在假想有一台主机有多张网卡,而且有多个IP地址,甚至这台主机即配置了IPV4又配置了IPV6,调用getLocalHost将会返回哪一个IP地址?很明显getLocalHost只能返回一个IP地址,因此就限定了getLocalHost方法并不是获取本机IP地址的最好方式。
Demo3-2给出了一台Linux系统一张网卡上配置IPV4和IPV6后,调用getLocalHost后的执行结果。从Configuration3-2中可以看出,在这台linux上配置了IPV4和IPV6,调用getLocalHost后,获取的是一个回环测试地址。
此外,使用InetAddress的isReachable时需要特别小心,因为默认情况下,isReachable使用ICMP报文来探测远程主机可达性(不一定使用ICMP,这与具体的实现有关),有很多服务器或者网络管理员禁用ping功能(ICMP),所以使用isReachable不可达,并不证明远程主机不存在。
Graphic3-2InetAddress拥有的公有操作。
Demo 3-1 InetAddress示例代码
package com.upc.upcgrid.guan.network.chapter03;
import java.io.IOException;
import java.net.InetAddress;
public class InetAddressTest {
public static void main(String[] args) throws IOException {
InetAddress addr = InetAddress.getLocalHost();//获取本机ip
System.out.println("local host : "+addr);
//获取指定服务的一个主机IP
addr = InetAddress.getByName("google.com");
System.out.println("google : " + addr);
//获取指定服务的所有主机IP
InetAddress[] addrs = InetAddress.getAllByName("google.com");
for(int i = 0 ;i < addrs.length ;i++)
System.out.println("google : "+addrs[i] + "number : " + i);
//获取远程主机可达性
System.out.println(InetAddress.getByName("localhost").isReachable(1000));
}
}
Demo3-1执行结果:
local host : PC2011022509cjh/202.194.158.128
google : google.com/74.125.71.99
google : google.com/74.125.71.99number : 0
google : google.com/74.125.71.103number : 1
google : google.com/74.125.71.104number : 2
google : google.com/74.125.71.105number : 3
google : google.com/74.125.71.106number : 4
google : google.com/74.125.71.147number : 5
true
demo3-1的配置:
configuration 3-1:windows主机的配置
C:\Documents and Settings\Administrator>ipconfig
Windows IP Configuration
Ethernet adapter 本地连接:
Connection-specific DNS Suffix. :
IP Address. . . . . . . . . . . . : 202.194.158.128
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 202.194.158.253
Demo3-2 linux 执行的代码:
System.out.println(InetAddress.getLocalHost());
Demo3-2 的输出结果:
Localhost.localdomain/127.0.0.1
Demo3-2 的配置环境
Configuration 3-2 linux主机的配置
[root@localhost ~]# ifconfig
eth0Link encap:EthernetHWaddr 00:E0:4C:3D:C2:73
inet addr:202.194.158.184Bcast:202.194.158.255Mask:255.255.255.0
inet6 addr: 2001:da8:7006:8003:2e0:4cff:fe3d:c273/64 Scope:Global
inet6 addr: fe80::2e0:4cff:fe3d:c273/64 Scope:Link
UP BROADCAST RUNNING MULTICASTMTU:1500Metric:1
RX packets:251210956 errors:1 dropped:28 overruns:1 frame:0
TX packets:116140638 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:16023749113 (14.9 GiB)TX bytes:34386034544 (32.0 GiB)
Interrupt:217 Base address:0x2000
loLink encap:Local Loopback
inet addr:127.0.0.1Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNINGMTU:16436Metric:1
RX packets:8274 errors:0 dropped:0 overruns:0 frame:0
TX packets:8274 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:8395613 (8.0 MiB)TX bytes:8395613 (8.0 MiB)
3.1.2 NetworkInterface类
可以使用NetworkInterface类提供的方法获取本地计算机网络接口相关的信息。尽管InetAddress类提获取IP地址的方法,但是要想获取本机的网络接口的详细信息,还需要依赖NetworkInterface接口中的方法。通过NetworkInterface接口,可以获取本机配置的网络接口的名字,IP列表(包括IPV4和IPV6),网卡地址,最大传输单元(MTU),接口状态(开启/关闭)、接口网络类型(点对点网络、回环网络)等信息。Graphic3-3列出来NetworkInterface中可用的公有方法。从Graphic3-3可以看出,NetworkInterface没有可见的构造方法,NetworkInterface内部也是使用静态方法来构造NetworkInterface实例的(简单工厂方法)。此外,每个NetworkInterface内部可以包含多个NetworkInterface对象,这就构成了一种树结构(合成模式),而且每个NetworkInterface内部保持一个指向父NetworkInterface的引用。
Demo3-3中给出了一个使用NetworkInterface获取本机eth0网络接口IPV4地址的一个示例程序,首先通过NetworkInterface的getByName静态方法,获取一个关于eth0的NetworkInterface实例,之后调用NetworkInterface的getInetAddresses获取配置在eth0上的所有IP地址(这时有可能获取到多个IP,因为一个网络接口可以配置多个IP),通过遍历获取的InetAddress,判断如果是IPV4,则将这个IP地址输出出来。需要提示的是,一般每台计算机都会在别名为eth0的网络接口上配置公网的IPV4或IPV6的地址,因此,直接使用eth0,即可获取配置的IP地址信息,此外还有一个别名为lo的网络接口,用来进行回环测试,其配置的IPV4一般为127.0.0.1。Demo3-3中给出的例子解决了InetAddress调用getLocalHost方法无法正确获取本机IP地址的问题。为了保守起见(防止有的计算机没有为网络端口起名为eth0),demo3-4给出了一个更一般的方法。在Demo3-4中,先通过NetworkInterface的静态方法getNetworkInterfaces获取本机的所有网络接口的父接口,之后遍历这个父接口获取下面的子接口,(在Configuration1和Configuration2中都配置了两个子接口,一个名字为eth0,一个名字为lo),之后遍历子接口的IP地址,输出结果。并且在输出中分辨出是IPV4的地址,还是IPV6的地址。
Graphic3-3 NetworkInterface类
Demo3-3 获取本机IPV4的地址
package com.upc.upcgrid.guan.network.chapter03;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
public class NetworkInterfaceTest {
public static void main(String[] args) throws SocketException {
NetworkInterface ni = NetworkInterface.getByName("eth0");
Enumeration ias = ni.getInetAddresses();
for(;ias.hasMoreElements();)
{
InetAddress ia = ias.nextElement();
if(ia instanceof InetAddress)
System.out.println(ia);
}
}
}
Demo3-3的执行结构
在Configuration3-1下:
/202.194.158.128
在Configuration3-2下:
/202.194.158.184
Demo3-4 测试本机的IP地址
package com.upc.upcgrid.guan.network.chapter03;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.Enumeration;
public class NetworkInterfaceTest2 {
public static void main(String[] args) throws SocketException {
Enumeration nis = NetworkInterface.getNetworkInterfaces();
for(;nis.hasMoreElements();)
{
NetworkInterface ni = nis.nextElement();
Enumeration ias = ni.getInetAddresses();
for(;ias.hasMoreElements();)
{
InetAddress ia = ias.nextElement();
if(ia instanceof Inet4Address && !ia.getHostAddress().equals("127.0.0.1"))
{
System.out.println("ip v4 : "+ia);
}else if(ia instanceof Inet6Address && !ia.equals(""))
{
System.out.println("ip v6 : "+ ia);
}
}
}
}
}
Demo3-4的执行结果:
Configuration3-1 下的执行结果:
ip v4 : /202.194.158.128
Configuration3-2下的执行结果:
ip v6 : /fe80:0:0:0:2e0:4cff:fe3d:c273%2
ip v6 : /2001:da8:7006:8003:2e0:4cff:fe3d:c273%2
ip v4 : /202.194.158.184
ip v6 : /0:0:0:0:0:0:0:1%1
3.1.3 简单总结
InetAddress用于表示一个IP地址,其两个子类Inet4Address和Inet6Address分别表示IPV4和IPV6两种类型的地址。使用InetAddress的getByName方法可以获取远程服务的IP地址(通过DNS服务获取的),使用getAllByName方法可以获取远程指定服务的所有服务主机的IP地址。使用getLocalHost方法可以获取本地IP地址,但是这种方式并不可靠,当出现多张网卡,或一个网络接口配置了多个IP,或者不同的操作系统类型,都不能保证能够获得想要的IP。
NetworkInterface可以获取本机网络接口的相关信息,包括硬件地址,MTU,所有的IP地址等信息,需要获取本机IP时,最好使用NetworkInterface对配置的IP地址进行筛选。
java什么是网络接口_java 网络编程 -- IP地址的表示与网络接口信息的获取(InetAddress和NetworkInterface)...相关推荐
- java上传网络图片_java网络编程之图片上传
输入输出流核心代码 所有的文件传输都是靠流,其中文件复制最具代表性.输入流和输出流,从输入流中读取数据写入到输出流中. InputStream in =输入源; OutputStream os=输出目 ...
- 网络编程------IP地址,端口号,套接字,网络字节序
IP地址 IP地址是IP协议中,用来标识网络中的唯一一台主机的地址.IP协议有两个版本IPv4,IPv6.在IPv4中,IP地址是一个4字节的32位的整数.在IPv6中,IP地址是一个 ...
- 网络编程-IP地址、端口号、网络字节序
IP地址.端口号.网络字节序 本文中部分名词可见: 协议.TCP/IP模型.数据包封装与分用 一.IP地址 1. 简单认识 IP协议有两个版本:IPv4和IPv6. (1)IP地址在IP协议中,用来标 ...
- C# 网络编程 IP地址转换
IP地址 IP地址:是给每个连接在因特网上的主机(或路由器)分配一个在全世界范围内惟一的标识符.一个IP地址主要由两部分组成:网络地址和主机地址. 网络地址由因特网权力机构分配,主机地址由各个网络的管 ...
- java网络接口_java网络编程之识别示例 获取主机网络接口列表
importjava.net.*; importjava.util.Enumeration; publicclassInetAddressExample{ publicstaticvoidmain(S ...
- java推送技术_java网络编程 - java服务器推送技术系列方案实战
前言 服务器推送技术(又名Comet)是建立在ARP基础之上的一种非常实用的技术,它广泛应用于Web端,手机APP应用端等.具体很多场景都需要此技术的支撑,包括扫码登录.扫码支付.网页支付.端到端消息 ...
- java 服务器 http请求_Java网络编程——发送HTTP请求到服务器
当Java程序需要向服务器发送请求或读取服务器数据时,使用URLConnection类是比较好的选择.URLConnection类封装了与服务器互动操作的方法,通过它可以建立与服务器的远程连接,检查服 ...
- java tcp怎么拆包_Java网络编程基础之TCP粘包拆包
TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想象河里的流水,他们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,他会根据TCP缓冲区的实 ...
- java程序设计简明教程张晓龙_Java网络编程简明教程
Java网络编程简明教程 网络编程 计算机网络相关概念 计算机网络是两台或更多的计算机组成的网络,同一网络内的任意两台计算机可以直接通信,所有计算机必须遵循同一种网络协议. 互联网 互联网是连接计算机 ...
最新文章
- React组件常用设计模式之Render Props
- POJ-2524-Ubiquitous Religions
- Exchange 日常管理之三设置邮件转发
- php读取txt插入数据库,PHP读取TXT文件插入数据库
- Mysql主备延迟的原因
- 小程序沉浸式_古北水镇红叶祭嵌入戏精学院 全新文旅沉浸模式让游客嗨起来...
- java调用c so动态库_jni 调用C动态库dll/so
- I/O复用函数的比较
- Linguistic Data Consortium (LDC)
- 从零搭建LNMP环境(三) - 安装MySQL数据库服务器
- 计算机软件服务可以自开专票,可以自开专票的小规模纳税人到底有几类?
- 死亡之ping(Ping of Death)
- Android实现断点下载功能
- c51单片机模块化编程
- 华为P30 HL2ELLEM VER.A手机图纸
- 计网考点 无线局域网
- Office EXCEL 创建图片超链接打不开怎么办 Excel打开图片提示发生了意外错误怎么办...
- CAD中插入外部参照字体会变繁体_提高CAD绘图效率,外部参照你真的懂?
- 新书预告:Xilix FPGA数字信号处理设计——基础版
- oracle 查询两张表合并,oracle的多表合并查询-工作心得
热门文章
- vscode 取消拉去变基_GIT快速回忆
- linux kill进程后黑屏,Linux中Kill进程的N种方法
- java中对象字节数_JAVA中求解对象所占字节大小
- 【超级鼠标键盘锁】项目工程下载地址
- 408考研数据结构复习-时间复杂度与空间复杂度-附统考真题
- 【Error】IDEA报错:org.jetbrains.jps.builders.java.dependencyView.TypeRepr$PrimitiveType cannot be cast t
- 最基础!MySQL基础查询SELECT
- Java集合(1)--集合概述
- lora终端连接云服务器_终端连接服务器主机
- 软件测试度量计算方法有哪些,软件测试度量(三)