目录

一、Java 网络工具类

1、InetAddress 类

2、URL 类

 二、Socket 编程


一、Java 网络工具类

1、InetAddress 类

在 TCP/IP 协议族中,是通过 IP 地址来标识网络上的一台主机的。假设需要在程序中获取本机的 IP 地址,该如何编写代码呢?通过查阅 JDK API 文档获悉,在 Java 中,使用 java.net 包下的 InetAddress 类表示互联网协议的 IP 地址。下面的案例演示了如何获得本地主机的 IP 地址

import java.net.*;
public class TestGetIP {
    public static void main(String args[]) {
        InetAddress myIP = null;
        try {
            //通过InetAddress类的静态方法,返回本地主机对象
            myIP = InetAddress.getLocalHost();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //通过InetAddress类的getHostAddress()方法获得IP地址字符串
        System.out.println(myIP.getHostAddress());
    }
}

如果不仅想获得本地主机的 IP 地址,还想根据用户输入的域名,获取这个域名在互联网上的 IP 地址:

import java.util.Scanner;
import java.net.*;
public class TestGetIP2 {
    public static void main(String args[]) {
        InetAddress sohuIP = null;
        Scanner input = new Scanner(System.in);
        System.out.print("请输入要查询IP地址的域名:");
        String dName = input.next();
        try {
            //通过InetAddress类的静态方法,返回指定域名的IP地址对象
            sohuIP = InetAddress.getByName(dName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("域名:" + dName + " 对应的IP地址为:" + sohuIP.getHostAddress());
    }
}

通过 InetAddress 类的静态方法获取 InetAddress 对象的方法 :

  • InetAddress[] getAllByName(String host):在给定主机名的情况下,根据系统上配置的名称服务 host 返回其 IP 地址所组成的数组。
  • InetAddress getByAddress(byte[] addr):给定字节数组形式的 IP 地址,返回 InetAddress 对象。
  • InetAddress getByAddress(String host, byte[] addr):根据提供的主机名 host 和字节数组形式的 IP 地址 addr,创建 InetAddress 对象。
  • InetAddress getByName(String host):给定主机名 host,返回 InetAddress 对象。
  • InetAddress getLocalHost():返回本地主机 InetAddress 对象。

InetAddress 类的其他常用方法有以下几种:

  • byte[] getAddress():返回此 InetAddress 对象的原始 IP 地址。
  • String getCanonicalHostName():返回此 IP 地址的完全限定域名。完全限定域名是指主机名加上全路径,全路径中列出了序列中所有域成员。
  • String getHostAddress():返回 IP 地址字符串。
  • String getHostName():返回此 IP 地址的主机名。

2、URL 类

URL 类代表一个统一资源定位符,它是指向互联网资源的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。

下面这个案例的具体需求为先输入要定位的 URL 地址,然后再输入要显示哪个页面标签元素的内容,程序显示该标签的具体内容

import java.util.Scanner;
import java.net.*;
import java.io.*;
public class TestURL {
    public static void main(String args[]) {
        URL tURL = null;
        BufferedReader in = null;
        Scanner input = new Scanner(System.in);
        System.out.print("请输入要定位的URL地址:");
        String url = input.next();
        System.out.print("请输入要显示哪个页面标签元素的内容:");
        String iStr = input.next();
        try {
            //通过URL字符串创建URL对象
            tURL = new URL(url);
            in = new BufferedReader(new InputStreamReader(tURL.openStream()));
            String s;
            while ((s = in.readLine()) != null) {
                if (s.contains(iStr))
                    System.out.println(s);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

URLConnection 类

前面介绍的 URL 类代表的是一个网络资源的位置,而接下来要介绍的 URLConnection 代表的是一种连接。此类的实例可用于读取和写入对应 URL 引用的资源。通常,创建一个到 URL 的连接 URLConnection 的对象需要以下几个步骤:

  1. 通过在 URL 上调用 openConnection() 方法创建连接对象。
  2. 设置参数和一般请求属性。
  3. 使用 connect() 方法建立到远程对象的实际连接。
  4. 远程对象变为可用,其中远程对象的头字段和内容变为可访问。

以下,列出一些 URLConnection 类的属性及其含义。

  • boolean doInput :将 doInput 标志设置为 true,指示应用程序要从 URL 连接读取数据,此属性的默认值为 true。此属性由 setDoInput() 方法设置,其值由 getDoInput() 方法返回。
  • boolean doOutput :将 doOutput 标志设置为 true,指示应用程序要将数据写入 URL 连接,此属性的默认值为 false。此属性由 setDoOutput() 方法设置,其值由 getDoOutput() 方法返回。
  • boolean useCaches :如果其值为 true,则只要有条件就允许协议使用缓存;如果其值为 false,则该协议始终必须获得此对象的新副本,其默认值为上一次调用 setDefaultUseCaches() 方法时给定的值。此属性由 setUseCaches() 方法设置,其值由 getUseCaches() 方法返回。

下面通过程序清单 TestURLConnection.java 中的案例,简要说明 URLConnection 类的使用

import java.net.*;
import java.io.*;
public class TestURLConnection {
    public static void main(String args[]) {
        try {
            //(1)通过在URL上调用openConnection()方法创建连接对象
            URL url = new URL("https://06b6a8566c13-service.simplelab.cn/examples/index.html");
            //根据URL获取URLConnection对象
            URLConnection urlC = url.openConnection();
            //请求协议是HTTP协议,故可转换为HttpURLConnection对象
            HttpURLConnection hUrlC = (HttpURLConnection) urlC;
            //(2)设置参数和一般请求属性
            //请求方法如果是POST,参数要放在请求体里,所以要向hUrlC输出参数
            hUrlC.setDoOutput(true);
            //设置是否从httpUrlConnection读入,默认情况下是true
            hUrlC.setDoInput(true);
            //请求方法如果是POST,不能使用缓存
            hUrlC.setUseCaches(false);
            //设置Content-Type属性
            hUrlC.setRequestProperty("Content-Type", "text/plain; charset=utf-8");
            //设定请求的方法为POST,默认是GET
            hUrlC.setRequestMethod("POST");
            //(3)使用connect方法建立到远程对象的实际连接
            hUrlC.connect();
            //(4)远程对象变为可用
            //通过HttpURLConnection获取输出输入流,可根据需求进一步操作
            OutputStream outStrm = hUrlC.getOutputStream();
            InputStream inStrm = hUrlC.getInputStream();
            //省略若干代码
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 二、Socket 编程

Socket 通常也称为套接字,应用程序通常通过套接字向网络发出请求或者应答网络请求。Java 语言中的 Socket 编程常用到 Socket 和 ServerSocket 这两个类, Socket 用于端对端的通信,而 ServerSocket 常用于服务端对象的创建,它们都位于 java.net 包中。

Socket 编程可以基于 TCP 编程,也可基于 UDP 编程,其中 TCP 方式主要是通过 Socket 和 ServerSocket 类实现,而 UDP 方式主要通过 DatagramSocket 和 DatagramPacket 类实现