• 注册
  • 赞助本站

    • 微信
    • 支付宝
    • Q Q

    感谢一直支持本站的所有人!

    • 查看作者
    • 1:Socket:网络基础简介以及InetAddress和URL的使用

      一.  网络基础简介

      1.  简介

      TCP/IP是目前世界上应用最为广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合。也称:TCP/IP协议族或TCP/IP协议栈。

      其中TCP全称Transmission Control Protocol,意为传输控制协议,IP全称Internet Protocol意为互联网协议

      2. TCP/IP模型

      由低到高共分为五层:物理层 —> 数据链路层 —> 网络层 —> 传输层 —> 应用层 ,TCP/IP属于传输层的协议,而用户直接接触到的是应用层,应用层有HTTP超文本传输协议,FTP文件传输协议,SMTP简单邮件传输协议,Telnet远程登录登录服务等等。

      3. IP地址

      为实现网络中不同计算机之间的通信,每台机器都必须有一个唯一的标识,也就是IP地址,一般我们常见的IP比如192.168.1.1都是IPV4,该版本定义了IP地址是由32位的二进制组成

      4. 端口号

      端口号用于区分不同应用程序,每个独立的应用程序都有一个单独的端口号。端口号范围为0~65535,其中0~1023为系统所保留。IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础。常用端口号:http:80 、ftp:21、telnet:23

      5. Java中的网络支持

      针对网络通信的不同层次,Java提供的网络功能有四大类:

      1、InetAddress:用于标识网络上的硬件资源

      2、URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据

      3、Sockets:使用TCP协议实现网络通信的Socket相关的类

      4、Datagram:使用UDP协议,将数据保存在数据报中,通过网络进行通信

      二.  InetAddress

      InetAddress类主要用于标识网络上的硬件资源,表示互联网协议(IP)地址。该类没有任何构造方法,无法通过new的方式创建该类对象,查看InetAddress的文档可以看到该类有多个静态方法的返回值都是InetAddress,所以我们可以通过这些静态方法来返回InetAddress的实例,常用的三个方法:

      • 通过本机获取InetAddress实例: InetAddress.getLocalHost();

      • 通过计算机名获取InetAddress实例: InetAddress.getByName("计算机名");

      • 通过IP地址获取InetAddress实例: InetAddress.getLocalHost(IP地址);

      @Test
      public void contextLoads() {
              try {
                  //获取本机的InetAddress实例
                  InetAddress address = InetAddress.getLocalHost();
                  System.out.println("计算机名:" + address.getHostName());
                  System.out.println("计算机IP地址:" + address.getHostAddress());
                  System.out.println("InetAddress对象:" + address);
                  System.out.println("计算机IP地址字节数组形式:" + Arrays.toString(address.getAddress()));
                  byte[] as = address.getAddress();
                  int[] is = new int[as.length];
                  for (int i = 0; i < as.length; i++) {
                      is[i] = as[i];
                      if(is[i] < 0) {
                          is[i] += 256;
                      }
                  }
                  System.out.println("计算机IP地址字节数组形式:" + Arrays.toString(is));
                  //根据机器名获取InetAddress实例
                  InetAddress zhangJia = InetAddress.getByName("ZhangJia");
                  System.out.println("计算机IP地址:" + zhangJia.getHostAddress());
      
                  //根据IP地址获取InetAddress实例
                  InetAddress ip = InetAddress.getByName("192.168.112.1");
                  System.out.println("计算机IP地址:" + ip.getHostAddress());
              } catch (UnknownHostException e) {
                  e.printStackTrace();
           }
      
      }
      
      输出:
      计算机名:ZhangJia
      计算机IP地址:192.168.112.1
      InetAddress对象:ZhangJia/192.168.112.1
      计算机IP地址字节数组形式:[-64, -88, 112, 1]
      计算机IP地址字节数组形式:[192, 168, 112, 1]
      计算机IP地址:192.168.112.1
      计算机IP地址:119.28.203.103
      计算机IP地址:/119.28.203.103

      三.  URL

      URL(Uniform Resource Locator)统一资源定位符,表示Internet上某一资源的地址。URL由两部分组成:协议名称和资源名称,中间用冒号隔开。比如https://zhangjia.io,其中https就是协议,而zhangjia.io就是资源名称。在java.net包中,提供了URL类来表示URL,URL类的常用方法如下:

      @Test
      public void contextLoads() {
      
          try {
              //创建一个URL实例
              URL zhangjia = new URL("https://zhangjia.io");
              //根据已经存在的URL实例创建新的URL实例
              URL url = new URL(zhangjia,"1.html?username=zj&age=22#test");
              System.out.println("协议" + zhangjia.getProtocol());
              System.out.println("主机" + zhangjia.getHost());
              //如果未指定端口号,则根据不同的协议使用默认的端口号
              // 但是对于getPort而言,如果你没指定端口号,那么默认返回-1
              System.out.println("端口号" + zhangjia.getPort());
              System.out.println("文件路径" + url.getPath());
              System.out.println("文件名称" + url.getFile());
              System.out.println("相对路径" + url.getRef());
              System.out.println("查询字符串" + url.getQuery());
      
          } catch (MalformedURLException e) {
              e.printStackTrace();
          }
      
      }
      
      输出:
      
      协议https
      主机zhangjia.io
      端口号-1
      文件路径/1.html
      文件名称/1.html?username=zj&age=22
      相对路径test
      查询字符串username=zj&age=22

      我们还可以通过URL的openStream()对象方法来获取指定资源的输入流,有了输入流,我们就可以读取和访问网络上的数据。

      @Test
      public void contextLoads() {
          try {
              //1. 创建一个URL实例
              URL zhangjia = new URL("https://zhangjia.io");
              //2. 通过URLopenStream方法获取URL对象所表示的资源的字节输入流
              InputStream inputStream = zhangjia.openStream();
              //3.  将字节输入流转换为字符输入流
              InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"utf-8");
              //4.  为字符输入流添加缓冲,提高读取效率
              BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
              //5.  读取数据,一次读取一行
              String data = bufferedReader.readLine();
              while (data != null ) {
                  System.out.println(data);
                  data = bufferedReader.readLine();
              }
              //6.  关闭各种流
              bufferedReader.close();
              inputStreamReader.close();
              inputStream.close();
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
      输出:
      整个网页的源代码

      参考资料

      本文所有内容根据慕课网汤小洋老师:Java Socket应用---通信是这样练成的 教程整理而成

    • 1
    • 1
    • 0
    • 113
    • 0
      nice