java什么是网络接口_java 网络编程 -- IP地址的表示与网络接口信息的获取(InetAddress和NetworkInterface)...

使用java进行网络程序的开发,可以说是一件令人愉悦的事情,对于用惯了C++网络接口编程的人来说,当他们首次使用Java开发网络应用程序,会发现java开发网络应用是如此的简单,甚至仅用几分钟时间,您就可以学会这种网络编程技术。本章主要对java网络编程相关的知识进行探讨,首先探讨java对于网卡信息获取方式,之后介绍如何使用java编写基于网络的客户端和服务端程序。最后探讨一些java网络相关的高级主题。

3.1 java获取网络通信信息

java为了方便网络编程,提供了表示IP地址的类、表示网络接口(这个接口是指网卡)的类,表示网络连接接口的类。下面主要探讨这些基本的类,以及如何使用这些类来获取网络信息。Graphic3-1给出了与网络通信信息相关的类之间的关系。

Graphic3-1 网络通信信息相关的类

20171584_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拥有的公有操作。

20171584_2

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类

20171584_3

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地址进行筛选。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用悲观锁定修复乐观锁定竞争条件

概括 在我以前的文章中 &#xff0c;我解释了使用显式乐观锁定的好处。 然后我们发现&#xff0c;在很短的时间范围内&#xff0c;并发交易仍可以在我们当前交易被提交之前立即提交产品价格更改。 此问题可以描述如下&#xff1a; 爱丽丝拿产品 然后&#xff0c;她决定订购…

分支限界

分支界定是一种在问题的解空间树上搜索问题的解的方法&#xff0c;其实就是剪枝广搜&#xff0c;它始终维护一个上下界用来剪枝&#xff0c;一个限界函数计算对解的最有期望。主要用于解决离散问题的优化。 分支界定的关键问题&#xff1a; &#xff08;1&#xff09;如何确定合…

mysql表变量临时表_表变量和临时表详解

首先让我们来看看什么是表变量和临时表。sql server 表变量1.初识表变量表变量在sql server 2000中首次被引用。表变量的定义和创建一个表大致相同&#xff0c;只不过是使用DECLARE variable而不是CREATE Table&#xff0c;表变量定义包括列定义&#xff0c;列名&#xff0c;数…

SWT外观:自定义FlatScrollBar颜色等

最近&#xff0c;我引入了一个自定义滑块控件 &#xff0c;该控件可用于改善SWT外观和更细微的视图布局的感觉。 令人高兴的是&#xff0c;该小部件似乎已经在Code Affine世界之外找到了较早的采用者 。 这导致了一些增强 &#xff0c;这些增强将在以下各节中介绍。 SWT滚动条…

类的静态数据成员

有时需要为某个类的所有对象分配一个单一的存储空间。在C语言中&#xff0c;可以用全局变量&#xff0c; 但这样很不安全。全局数据可以被任何人修改&#xff0c;而且&#xff0c;在一个项目中&#xff0c;它很容易与其他的名字 相冲突。如果可以把一个数据当成全局变量那样去存…

【Android 13】使用Android Studio调试系统应用之Settings移植(三):构建settingsLib项目目录

文章目录 一、篇头二、系列文章2.1 Android 13 系列文章2.2 Android 9 系列文章2.3 Android 11 系列文章三、AS新建SettingsLib New Moudle3.1 创建 New Moudle3.2 替换源文件(1)选定复制目标(2)复制到AS目录,并改名(3)完成创建四、下一步动作五、篇尾

java虚拟机编译_[四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式...

前言简介前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明想要了解JVM的运行机制,以及如何优化你的代码,你还需要了解一下,java编译器到底是如何编译你的代码的本文不是从最底层的编译原理讲解本文是针对java代码,去查看归纳总结编译…

提高性能:流的非阻塞处理

1.简介 想象一下&#xff0c;我们有一个需要访问外部Web服务的应用程序&#xff0c;以便收集有关客户端的信息&#xff0c;然后对其进行处理。 更具体地说&#xff0c;我们无法在一次调用中获得所有这些信息。 如果我们要查找不同的客户端&#xff0c;则需要多次调用。 如下图…

通过NAT转发实现私网对外发布信息

我们可以在防火墙的外部网卡上绑定多个合法IP地址&#xff0c;然后通过ip映射使发给其中某一个IP地址的包转发至内部某一用户的WWW服务器上&#xff0c;然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。具体的IP分配如下&#xff1a; &#xff08;1&#xff09;该ISP分配…

java支付管理有源码_java支付宝支付案例源码

【实例简介】※运行环境※Eclipse JDK1.6及以上 Tomcat6.0及以上※使用方法※SDK下载地址&#xff1a;https://doc.open.alipay.com/docs/doc.htm?treeId193&articleId103419&docType1第一步&#xff1b;请下载【JAVA版资源】的SDK。第二步&#xff1a;下载完毕后&…

CDI和EJB:在事务成功时发送异步邮件

再一次问好&#xff01; :) 这次&#xff0c;我选择了一项常见任务&#xff0c;我认为大多数情况下都以错误的方式完成&#xff1a;发送电子邮件。 并非所有人都不知道电子邮件API的工作方式&#xff0c;例如JavaMail或Apache的commons-email 。 我通常看到的一个问题是&#…

SPFILE 、PFILE 的全面解读

这里先阐述一下数据库的启动过程&#xff1a; 1. 启动实例/例程&#xff08;nomount状态&#xff09;时&#xff0c;读取参数文件(文本文件PFILE 或服务器参数文件SPFILE)&#xff0c;分配SGA、启动后台进程、打开告警文件及后台进程跟踪文件&#xff1b; 2. 装载数据…

JAVA确定这天是这年的某一天_[Java] 练习题014: 输入某年某月某日,判断这一天是这一年的第几天?...

import java.util.*;public class Test014{public static void main(String[] args) throws Exception{int y,m,d;int sum0;int feb28;Scanner in new Scanner(System.in);System.out.print("请输入年份:");y in.nextInt();System.out.print("请输入月份:&quo…

使用默认方法的界面演变–第一部分:方法

几周前&#xff0c;我们详细研究了默认方法 -Java 8中引入的一项功能&#xff0c;该功能允许为接口方法提供实现&#xff0c;即方法主体&#xff0c;从而定义接口中的行为。 引入此功能是为了实现接口演进 。 在JDK的上下文中&#xff0c;这意味着在不破坏所有代码的情况下向接…

java左手握右手_环保型燃料—丙烷(C3H8)曾用于北京奥运会“祥云”火炬燃料,下列有关烷烃的说法不正确的是()A.丙烷分子中三个...

参考答案如下环保会祥【单选题】环境景观设计的核心就是以研究()为基础。型燃下列【判断题】构成中央处理器的两大部件是运算器和存储器。料丙料【单选题】通过下列哪种方式可以获得最强的免疫效果【单选题】根据断面图的标注形式&#xff0c;烷C烷烃下列绘制规范的断面图是【单…

windbg script ---- 禁用IsDebuggerPresent

简单的script r $t0 kernelBase!IsDebuggerPresent; eb $t00x9 31 c0 90 90强制把原代码改成xor eax, eax; nop; nop 注意在xp下&#xff0c;使用kernel32 转载于:https://www.cnblogs.com/hgy413/p/3693400.html

java两个和三个_Java语言基础(day_03)

数据类型中补充的几个小问题1)在定义Long或者Float类型变量的时候&#xff0c;要加L或者f。整数默认是int类型&#xff0c;浮点数默认晨double。byte&#xff0c;short在定义的肘候&#xff0c;他们接收的某实是一个int类型的值。这个是自己做了一个数据检测的&#xff0c;如果…

Hibernate中的JPA 2.1条件删除/更新和临时表

从JPA 2.0版开始&#xff0c; EntityManager提供了方法getCriteriaBuilder()来动态构建选择查询&#xff0c;而无需使用Java持久性查询语言&#xff08;JPQL&#xff09;进行字符串连接。 在2.1版中&#xff0c;此CriteriaBuilder提供了两个新方法createCriteriaDelete()和crea…

使用Hamcrest增强JUnit的测试能力

package com.jadyer.service;import java.util.HashMap; import java.util.Map;import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Test;/*** 使用Hamcrest增强JUnit的测试能力* see Hamcrest框架提供了一些相对通俗并高效的方法来进行一些junit比较困…

在Websphere 8.0上安装Liferay 6.2 Enterprise Edition

为Liferay准备Websphere 当应用服务器二进制文件均已安装完毕&#xff0c;启动WebSphere应用服务器&#xff08;WAS&#xff09; 配置文件管理工具来创建一个配置文件适用于Liferay的和遵循的指示说明这里正式Liferay的文档。 这些说明用于在Websphere 8.5上安装Liferay 6.2&am…