• Java 之 网络常用API


    Java程序可以非常方便的访问互联网上的 HTTP 服务、FTP 服务等,并可以直接取得互联网上的远程资源,还可以向远程资源发送 GET、POST 请求。

    一、InetAddress 类

      此类表示互联网协议(IP)地址,它有两个子类 Inet4Address 和 Inet6Address,分别对应IPV4和IPV6。InetAddress 类没有提供公共的构造器,而是提供了几个静态方法来获取 InetAddress 实例。

      获取InetAddress实例方法:

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

       常用方法:

    public String getHostAddress():返回 IP 地址字符串(以文本表现形式)。
    public String getHostName():获取此 IP 地址的主机名
    public String getCanonicalHostName():获取此 IP 地址的完全限定域名
    public boolean isReachable(int timeout):测试是否可以达到该地址。
    public byte[] getAddress() :返回此 InetAddress 对象的原始 IP 地址 
    

       Demo:

     1 public class TestInetAddress {
     2     public static void main(String[] args) throws Exception{
     3         InetAddress ip1 = InetAddress.getLocalHost();
     4         System.out.println(ip1);//njf/192.168.233.1
     5         
     6         InetAddress ip2 = InetAddress.getByName("www.baidu.com");
     7         System.out.println(ip2);//www.baidu.com/182.61.200.6
     8         
     9         byte[] ip = {(byte)182,61,(byte)200,6};
    10         InetAddress ip3 = InetAddress.getByAddress(ip);
    11         //输出ip而不是域名。如果这个IP地址不存在或DNS服务器不允许进行ip-->域名的映射,getHostName()方法就直接返回这个IP地址
    12         System.out.println(ip3);
    13     }
    14 }

    二、URL

      URI(Uniform resource identifier):表示一个统一资源标识符 (URI) 引用,用来唯一的标识一个资源。

      URL(Uniform Resource Locator):类 URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数据库或搜索引擎的查询。它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate这个资源。URI不能用于定位任何资源,它的唯一作用是解析,而URL则包含一个可打开到达该资源的输入流。

      URL的基本结构由5部分组成:

    <传输协议>://<主机名>:<端口号>/<文件名>#片段名

    <传输协议>://<主机名>:<端口号>/<文件名>?参数列表

        其中 # 片段名: 即锚点

        例如:http://java.sun.com/index.html#chapter1

        参数列表格式:参数名=参数值&参数名=参数值....

        例如:http://192.168.1.100:8080/helloworld/index.jsp?username=chai&password=123

       URL构造方法:

    public URL (String spec):通过一个表示URL地址的字符串可以构造一个URL对象
    public URL(URL context, String spec):通过基 URL 和相对 URL 构造一个 URL 对象
    URL(String protocol, String host, String file) :根据指定的 protocol 名称、host 名称和 file 名称创建 URL
    URL(String protocol, String host, int port, String file):根据指定 protocol、host、port 号和 file 创建 URL 对象
    

        Demo:

    1 URL url = new URL ("http://www.baidu.com/");
    2 URL downloadUrl = new URL(url, "download.html");
    3 URL url2 = new URL("http", "www.baidu.com", “download. html");
    4 URL gamelan = new URL("http", "www.baidu.com", 80, “download.html");

       URL常用方法:

    public String getProtocol():获取该URL的协议名
    public String getHost():获取该URL的主机名
    public String getPort():获取该URL的端口号
    public String getPath():获取该URL的文件路径,即tomcat的webapps目录下级目录名也就是资源路径名
    public String getFile():获取该URL的文件名
    public String getRef():获取该URL在文件中的相对位置
    public String getQuery():获取该URL的查询名
    public final InputStream openStream():返回一个用于从该连接读入的 InputStream。
    public Object getContent():获取次 URL 的内容
     

        Demo1:

     1 import java.net.MalformedURLException;
     2 import java.net.URL;
     3 
     4 public class TestURL {
     5     public static void main(String[] args) throws MalformedURLException {
     6         URL url = new URL("http://www.baidu.com:80/index.html?keyword=java");
     7         System.out.println("协议:" + url.getProtocol()); //协议:http
     8         System.out.println("主机名:" + url.getHost()); //主机名:www.baidu.com
     9         System.out.println("端口号:" + url.getPort()); //端口号:80
    10         System.out.println("路径名:" + url.getPath()); //路径名:/index.html
    11         System.out.println("文件名:" + url.getFile()); //文件名:/index.html?keyword=java
    12         //注意如果存在锚点,那么查询名返回null,因为#后面全部当做锚点了
    13         System.out.println("锚点:" + url.getRef()); //锚点:null
    14         System.out.println("查询名:" + url.getQuery()); //查询名:keyword=java
    15     }
    16 }

        Demo2:

     1 import java.io.InputStream;
     2 import java.net.URL;
     3 
     4 public class TestURLRead {
     5     public static void main(String[] args)throws Exception {
     6         URL url = new URL("http://www.baidu.com/index.html");
     7         /*html标签(格式化数据)、css:皮肤(美化数据)、js:互动(交互数据)、数据:*/
     8         InputStream input = url.openStream();
     9         byte[] data = new byte[1024];
    10         int len;
    11         while((len=input.read(data))!=-1){
    12             System.out.println(new String(data,0,len,"UTF-8"));
    13         }
    14         input.close();
    15     }
    16 }

    三、URLConnection

      URL的方法openStream(),能从网络上读取数据,但是无法给服务器端发送数据,若希望给服务器端发送数据,则需要URLConnection。

      它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。通常,创建一个到 URL 的连接需要几个步骤:

        1. 通过 URL 对象调用 openConnection 方法创建 URLConnection 对象;

        2. 处理设置参数和一般请求属性;

        3. 使用 connect 方法建立到远程对象的实际连接;

        4. 远程对象变为可用,远程对象的头字段和内容变为可访问。

      常用方法:

    public void setDoOutput(boolean dooutput)如果打算使用 URL 连接进行输出,例如给服务器传递请求参数,则将 DoOutput 标志设置为 true;如果不打算使用,则设置为 false。默认值为 false。 必须在所有getXXX()和connect()方法之前。
    public String getContentEncoding():返回 content-encoding 头字段的值。
    public int getContentLength():返回 content-length 头字段的值。 
    public String getContentType():返回 content-type 头字段的值。 
    public long getDate():返回 date 头字段的值。
    public long getLastModified():返回 last-modified 头字段的值。结果为距离格林威治标准时间 1970 年 1 月 1 日的毫秒数。
    public String getHeaderField(String name):返回指定的头字段的值。 
    public InputStream getInputStream()返回从此打开的连接读取的输入流。
    public OutputStream getOutputStream()返回写入到此连接的输出流。
    

      Demo:

     1 import java.io.BufferedReader;
     2 import java.io.InputStream;
     3 import java.io.InputStreamReader;
     4 import java.net.URL;
     5 import java.net.URLConnection;
     6 
     7 public class TestURLConnection {
     8     public static void main(String[] args) throws Exception{
     9         URL url = new URL("http://localhost/web1/login");
    10         //通过 URL对象调用 openConnection 方法创建URLConnection连接对象
    11         URLConnection uc = url.openConnection();
    12         //处理设置参数
    13         uc.setDoOutput(true);
    14         //给服务器发送请求参数
    15         uc.getOutputStream().write("username=admin&password=123".getBytes());
    16         //使用 connect 方法建立到远程对象的实际连接。
    17         uc.connect();
    18         //获取资源
    19         InputStream is = uc.getInputStream();
    20         BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
    21         String str;
    22         while((str=br.readLine())!=null){
    23             System.out.println(str);
    24         }
    25         br.close();
    26     }
    27 }

    四、Socket 

      通信的两端都要有Socket(也可以叫“套接字”),是两台机器间通信的端点。可以和网卡驱动进行交流,负责把数据交给网卡驱动,或者从网卡驱动中提取数据。网络通信其实就是Socket间的通信。

      Socket 可分为:

      •  流套接字(stream socket):使用 TCP 提供可依赖的字节流服务(ServerSocket类和Socket类)
      •    数据包套接字(datagram socket):使用 UDP 提供“尽力而为” 的数据报服务(DatagramSocket类)

        

       Socket 类的常用构造方法:

    public Socket(InetAddress address,int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
    public Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口号。
    

      Socket 类的常用方法:

    public InputStream getInputStream():返回此套接字的输入流,可以用于接收消息
    public OutputStream getOutputStream():返回此套接字的输出流,可以用于发送消息
    public InetAddress getInetAddress():此套接字连接到的远程 IP 地址;如果套接字是未连接的,则返回 null。
    public InetAddress getLocalAddress():获取套接字绑定的本地地址。
    public int getPort():此套接字连接到的远程端口号;如果尚未连接套接字,则返回 0。
    public int getLocalPort():返回此套接字绑定到的本地端口。如果尚未绑定套接字,则返回 -1。
    public void close():关闭此套接字。套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接或重新绑定)。需要创建新的套接字对象。 关闭此套接字也将会关闭该套接字的 InputStream 和 OutputStream。 
    public void shutdownInput():如果在套接字上调用 shutdownInput() 后从套接字输入流读取内容,则流将返回 EOF(文件结束符)。 即不能在从此套接字的输入流中接收任何数据。
    public void shutdownOutput():禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列。 如果在套接字上调用 shutdownOutput() 后写入套接字输出流,则该流将抛出 IOException。 即不能通过此套接字的输出流发送任何数据。
    

      注意:

        先后调用Socket的shutdownInput()和shutdownOutput()方法,仅仅关闭了输入流和输出流,并不等于调用Socket的close()方法。在通信结束后,仍然要调用Scoket的close()方法,因为只有该方法才会释放Socket占用的资源,比如占用的本地端口号等。

     

  • 相关阅读:
    2020.10.10收获(动手动脑三)
    2020.10.8收获
    2020.10.4收获
    2020.10.11收获
    2020.10.6收获
    2020.10.7收获(动手动脑二)
    2020.10.9收获
    2020.10.3收获
    2020.10.2收获
    2020.10.5收获
  • 原文地址:https://www.cnblogs.com/niujifei/p/12290288.html
Copyright © 2020-2023  润新知