一、实验目的
学习网络编程基本概念、InetAddress的应用、URL的应用、URLConnection的应用
二、实验内容
InetAddress类和URLConnection类的使用
三、实验环境
使用Windows操作系统;Internet连接
Eclipse+Java开发环境
四、实验步骤
1 InetAddress类
1.1 InetAddress类的简介
Internet上的主机有两种表示地址的方式:域名和IP地址。有时候需要通过域名来查找它对应的IP地址,有时候又需要通过IP地址来查找主机名。这时候可以利用java.net包中的InetAddress类来完成任务。
InetAddress类是IP地址封装类,同时它也是一个比较奇怪的类,它没有公共的构造方法,只能利用该类的一些静态方法来获取对象实例,然后再通过这些对象实例来对IP地址或主机名进行处理。该类常用的一些静态方法有如下。
public static InetAddress getByName(String hostname):根据给定的主机名创建一个InetAddress对象,可用来查找该主机的IP地址
public static InetAddress getByAddress (byte[] addr):根据给定的IP地址创建一个InetAddress对象,可用来查找该IP对应的主机名
public static getHostAddress():获取IP地址
public static getHostName():获取主机名
此外,该类还有一些其他常用的方法,具体如下:
String getCanonicalHostName():获取此 IP 地址的完全限定域名
String getHostAddress():返回 IP 地址字符串(以文本表现形式)
String getHostName():获取此 IP 地址的主机名
Int hashCode():返回此 IP 地址的哈希码
Boolean isAnyLocalAddress():检查 InetAddress是否是通配符地址的实用例行程序
boolean isLinkLocalAddress():检查 InetAddress是否是链接本地地址的实用例行程序
boolean isLoopbackAddress():检查 InetAddress是否是回送地址的实用例行程序
Boolean isMCGlobal():检查多播地址是否具有全局域的实用例行程序
Boolean isMCLinkLocal():检查多播地址是否具有链接范围的实用例行程序
Boolean isMCNodeLocal():检查多播地址是否具有节点范围的实用例行程序
Boolean isMCOrgLocal():检查多播地址是否具有组织范围的实用例行程序
Boolean isMCSiteLocal():检查多播地址是否具有站点范围的实用例行程序
Boolean isMulticastAddress():检查 InetAddress 是否是 IP 多播地址的实用例行程序
Boolean isReachable(int timeout):测试是否可以达到该地址
Boolean isReachable(NetworkInterface netif, int ttl, int timeout):测试是否可以达到该地址
Boolean isSiteLocalAddress():检查 InetAddress 是否是站点本地地址的实用例行程序
String toString():将此 IP 地址转换为 String
1.2 获取本地机的名称和IP地址
由于我们已经学习了InetAddress类的一些方法,在此,我们可以直接利用getLocalHost方法获取本地主机名和本地地址。
图 1 获取本机名与地址的代码
如图 1,第一行引入所需的java.net包。在主函数内,先定义InetAddress类,并调用getLocalHost方法获取对应的地址,最后将结果进行输出即可。
图 2 获取本机名与地址的输出
如图 2,即为输出的结果,我们电脑的主机名为“YunhaoAlienware”,地址为192.168.85.1
1.3 获取CSDN的全部IP地址
由于我们已经学习了InetAddress类的一些方法,在此,我们可以直接利用getAllByName方法,将所有IP地址存入一个列表并进行输出。
图 3 获取CSDN的所有IP地址代码
如图 3,第一行引入所需的java.net包。在主函数内,先定义InetAddress类的数组,并调用getAllByName方法获取所有的IP地址并存入数组,最后将结果进行输出即可。
图 4 获取CSDN的所有IP地址的输出
如图 4,即为输出的结果,CSDN只有一个IP地址,为39.106.226.142。
2 URL类与URLConnection类
2.1 URL类的简介
URL 类代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。通常,URL 可分成几个部分。
如https://www1.szu.edu.cn/board/view.asp,该 URL 示例指示使用的协议为 https (超文本传输安全协议)并且该信息驻留在一台名为www1.szu.edu.cn 的主机上。主机上的信息名称为/board/view.asp。主机上此名称的准确含义取决于协议和主机。该信息一般存储在文件中,但可以随时生成。该 URL 的这一部分称为路径部分。
此外,URL 可选择指定一个“端口”,它是用于建立到远程主机 TCP 连接的端口号。如果未指定该端口号,则使用协议默认的端口。例如,http 协议的默认端口为 80。
URL类有如下6种构造方法:
URL(String spec):根据 String 表示形式创建 URL 对象
URL(String protocol, String host, int port, String file):根据指定 protocol、host、port 号和 file 创建 URL 对象
URL(String protocol, String host, int port, String file, URLStreamHandler handler):根据指定的 protocol、host、port 号、file 和 handler 创建 URL 对象
URL(String protocol, String host, String file):根据指定的 protocol 名称、host 名称和 file 名称创建 URL
URL(URL context, String spec):通过在指定的上下文中对给定的 spec 进行解析创建 URL
URL(URL context, String spec, URLStreamHandler handler):通过在指定的上下文中用指定的处理程序对给定的 spec 进行解析来创建 URL
此外,URL类还有一些其他常用的方法,具体如下:
boolean equals(Object obj):比较此 URL 是否等于另一个对象。
String getAuthority():获取此 URL 的授权部分。
Object getContent():获取此 URL 的内容。
Object getContent(Class[] classes):获取此 URL 的内容。
int getDefaultPort():获取与此 URL 关联协议的默认端口号。
String getFile():获取此 URL 的文件名。
String getHost():获取此 URL 的主机名(如果适用)。
String getPath():获取此 URL 的路径部分。
int getPort():获取此 URL 的端口号。
String getProtocol():获取此 URL 的协议名称。
String getQuery():获取此 URL 的查询部分。
String getRef():获取此 URL 的锚点(也称为“引用”)。
String getUserInfo():获取此 URL 的 userInfo 部分。
int hashCode():创建一个适合哈希表索引的整数。
URLConnection openConnection():返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。
URLConnection openConnection(Proxy proxy):与 openConnection() 类似,所不同是连接通过指定的代理建立;不支持代理方式的协议处理程序将忽略该代理参数并建立正常的连接。
InputStream openStream():打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。
boolean sameFile(URL other):比较两个 URL,不包括片段部分。
protected void set(String protocol, String host, int port, String file, String ref):设置 URL 的字段。
protected void set(String protocol, String host, int port, String authority, String userInfo, String path, String query, String ref):设置 URL 的指定的 8 个字段。
static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac):设置应用程序的 URLStreamHandlerFactory。
String toExternalForm():构造此 URL 的字符串表示形式。
String toString():构造此 URL 的字符串表示形式。
URI toURI():返回与此 URL 等效的 URI。
2.2 URLConnection类的简介
URLConnection是一个抽象类,表示指向URL指定资源的活动连接。URL类中的openConnection()方法可生成一个URLConnection对象,URLConnection类的实例可用于读取和写入此URL引用的资源。在网络编程工作中,JAVA的URLConnection是一个常用的类,它提供了一个非常方便的接口,只要提供需要连接的主机的URL地址,使用URL类的openConnection()方法就可以得到一个HttpURLConnection的对象,其中HttpURLConnection类是URLConnection类的子类,然后在此基础上分析HTTP内容,完成相关任务。在这种方式下,使用者不必考虑底层的实现细节,避免了烦琐的Socket类的代码编写,因此比较常用
URLConnection类常用的构造方法只有一个,即通过URL获取对应的URLConnection类:
protected URLConnection(URL url)
在建立了远程对象后,则会经常使用如下方法来获取对应的值:
getContent: 获取此 URL 连接的内容。
getHeaderField: 返回指定的头字段的值。如果调用的连接多次使用不同的值设置了头字段,则只返回最后一次设置的值。
getInputStream: 返回从此打开的连接读取的输入流。 在读取返回的输入流时,如果在数据可供读取之前达到读入超时时间,则会抛出 SocketTimeoutException。
getOutputStream: 返回写入到此连接的输出流。
2.3使用URL类下载一张图片
URL类经常用于下载网络资源,URL通过构造函数(构造函数为URL地址)可以得到一个对象,该对象的openStream()方法可以得到InputStream对象,得到InputStream就可以把网站上的资源下载下来了。下面是一个实例,使用URL类下载某个网站上的一张图片并保存到本地。
图 5 使用URL下载图片的代码
如图 5,前两行引入所需的包,第6,7行借助URL类获取输入流,并在第9-13行利用循环将输入流存入本地文件中。
图 6 使用URL下载的图片
如图 6,即为使用URL下载的图片。
2.4使用URL类下载深大首页,并统计下载得到网页文件的大小
由于我们已经学习了URL类的一些方法,在此,我们可以直接利用URL类建立连接,并通过结合URLConnection类的方法,借助流来获取深大首页的文件。
图 7 URL类下载深大首页代码
如图 7,首先前三行引入所需的包。第8,9行借助URL类和URLConnection类建立连接,第11行使用getInputStream方法获取对应的输入流,第12行使用文件流创建文件。然后第13-17行利用while循环将内容读入到文件中。最后19-20行借助文件获取对应html文件的大小。
图 8 获取的html文件的大小
图 9 获取的HTML文件
如图 9,获取的深大主页的文件如图所示;如图 8,获取的html文件的大小为92.9kb。
附录
代码如下:
import java.io.*; import java.net.InetAddress; import java.net.URL; import java.net.URLConnection; public class Main { public static void main(String[] args) throws IOException { //使用InetAddress类的方法获取本地机的名称和IP地址 InetAddress address = InetAddress.getLocalHost(); System.out.println("Localhost:" + address); //使用InetAddress类的方法获取网站www.csdn.net的IP地址,如果存在多个IP地址,要求全部返回 InetAddress[] address_Arr = InetAddress.getAllByName("www.csdn.net"); System.out.println("All the IP address about CSDN:"); for (InetAddress inetAddress : address_Arr) { System.out.println(inetAddress.toString()); } // 使用URL类下载深圳大学首页http://www.szu.edu.cn,并统计下载得到网页文件的大小 URL url = new URL("https://www.szu.edu.cn"); URLConnection url_connection = url.openConnection(); InputStream in = url_connection.getInputStream(); FileOutputStream fout = new FileOutputStream("szu_index.html"); int a = 0; while (a > -1) { a = in.read(); fout.write(a); } fout.close(); File file = new File("szu_index.html"); System.out.println("File size:" + file.length() / 1024.00 + "k"); } }