• 中文
    • English
  • 注册
  • 查看作者
  • 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.pro,其中https就是协议,而zhangjia.io就是资源名称。在java.net包中,提供了URL类来表示URL,URL类的常用方法如下:

    @Test
    public void contextLoads() {
    
        try {
            //创建一个URL实例
            URL zhangjia = new URL("https://zhangjia.pro");
            //根据已经存在的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.pro");
            //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应用—通信是这样练成的 教程整理而成

  • 0
  • 1
  • 0
  • 1.5k
  • zjmarina张甲的邻居

    请登录之后再进行评论

    登录
  • 0
    nice
  • 单栏布局 侧栏位置: