Java基础之网络编程(二)(上)

简介: 前言文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820…种一棵树最好的时间是十年前,其次是现在

絮叨


昨天的文章,全是理论,没有一行代码,但是计算机网络,本来就是很枯燥的一门课程,如果能理解它的概念,对你开发也是莫大的好处的,今天我们来学习一下Java中是怎么具体使用它的。

🔥Java基础之网络编程(一)

访问网络的传输过程(上网的流程)


  1. 首先输入 网址 电脑会自己去dns域名解析服务器去找到 对应的ip 然后返回给请求的那台机器 上网的这台机器 通过交换机 路由器 接到 isp网络运营商  他会一层一层的通过 自己的ip mac地址 和目标服务器的 ip 和mac 然后每次的中转路由 他的目标ip是固定的 跳转的mac是通过路由算法得到 最终就可以连接到目标服务器 然后就可以上网的 这就是 网络的传输过程

自己对 ISO 网络7层模型的理解


  • 从上到下
  • 第七层 应用层 类似于 百度这种网站 就算一个应用 软件 各种客户端 能产生网络流量的程序 就是应用层
  • 第六层 表示层  就是 在传输之前 是否进行加密 或者压缩
  • 第五层 会话层 2个应用就行通信需要建立会话连接 类似于tcp的三次握手 四次挥手  我们可以在这一层 查木马 netstat -n
  • 第四层 传输层  可靠传输tcp  不可靠输层 udp等
  • 第三层 网络层 ip 负责最佳路径的规范
  • 第二层 数据链路层 规范 帧的开始和结束
  • 第一层 物理层 就是硬件设备 接口的标准 电器标准 传输速度优化


对数据的封装过程


  • 上三层  就是封装数据我们从数据库查出来的数据 然后传输
  • 传输层  tcp头 + 上层数据 == 叫数据段
  • 网络层 ip头+tcp头 + 上层数据 == 叫数据包
  • 数据链路层 mac头+ip头+tcp头 + 上层数据 +fcs对数据的校验 ==叫数据帧
  • 物理层  把数据链路层的数据 封装成 0101 ==bit


IP地址与端口号


要想使网络中的计算机能够进行通信,必须为每台计算机指定一个标识号,通过这个标识号来指定接受数据的计算机或者发送数据的计算机

在TCP/IP协议中,这个标识号就是IP地址,它可以唯一标识一台计算机,目前,IP地址广泛使用的版本是IPv4,它是由4个字节大小的二进制数来表示,如:00001010000000000000000000000001。由于二进制形式表示的IP地址非常不便记忆和处理,因此通常会将IP地址写成十进制的形式,每个字节用一个十进制数字(0-255)表示,数字间用符号“.”分开,如 "192.168.1.100"

随着计算机网络规模的不断扩大,对IP地址的需求也越来越多,IPV4这种用4个字节表示的IP地址面临枯竭,因此IPv6 便应运而生了,IPv6使用16个字节表示IP地址,它所拥有的地址容量约是IPv4的8×1028倍,达到2128个(算上全零的),这样就解决了网络地址资源数量不够的问题

通过IP地址可以连接到指定计算机,但如果想访问目标计算机中的某个应用程序,还需要指定端口号。在计算机中,不同的应用程序是通过端口号区分的。端口号是用两个字节(16位的二进制数)表示的,它的取值范围是0 ~ 65535,其中,1024以下的端口号用于一些知名的网络服务和应用,用户的普通应用程序需要使用1024以上的端口号,从而避免端口号被另外一个应用或服务所占用

接下来通过一个图例来描述IP地址和端口号的作用,如下图所示


从上图中可以清楚地看到,位于网络中一台计算机可以通过IP地址去访问另一台计算机,并通过端口号访问目标计算机中的某个应用程序

InetAddress

了解了IP地址的作用,我们看学习下JDK中提供了一个InetAdderss类,该类用于封装一个IP地址,并提供了一系列与IP地址相关的方法,下表中列出了InetAddress类的一些常用方法


上图中,列举了InetAddress的四个常用方法。其中,前两个方法用于获得该类的实例对象,第一个方法用于获得表示指定主机的InetAddress对象,第二个方法用于获得表示本地的InetAddress对象。通过InetAddress对象便可获取指定主机名,IP地址等,接下来通过一个案例来演示InetAddress的常用方法


public class Example01 {
      public static void main(String[] args) throws Exception {
        InetAddress local = InetAddress.getLocalHost();
        InetAddress remote = InetAddress.getByName("www.baidu.com");
        System.out.println("本机的IP地址:" + local.getHostAddress());
        System.out.println("IP地址:" + remote.getHostAddress());
        System.out.println("主机名为:" + remote.getHostName());
      }
    }
复制代码


tcp 是如何实现可靠传输的


  • 停止等待协议   超时重传
  • 目前用的是流水线传输 提高信道的利用率
  • 以字节为单位的滑动窗口技术

UDP通讯


DatagramPacket

前面介绍了UDP是一种面向无连接的协议,因此,在通信时发送端和接收端不用建立连接。UDP通信的过程就像是货运公司在两个码头间发送货物一样。在码头发送和接收货物时都需要使用集装箱来装载货物,UDP通信也是一样,发送和接收的数据也需要使用“集装箱”进行打包,为此JDK中提供了一个DatagramPacket类,该类的实例对象就相当于一个集装箱,用于封装UDP通信中发送或者接收的数据


想要创建一个DatagramPacket对象,首先需要了解一下它的构造方法。在创建发送端和接收端的DatagramPacket对象时,使用的构造方法有所不同,接收端的构造方法只需要接收一个字节数组来存放接收到的数据,而发送端的构造方法不但要接收存放了发送数据的字节数组,还需要指定发送端IP地址和端口号

使用该构造方法在创建DatagramPacket对象时,指定了封装数据的字节数组和数据的大小,没有指定IP地址和端口号。很明显,这样的对象只能用于接收端,不能用于发送端。因为发送端一定要明确指出数据的目的地(ip地址和端口号)而接收端不需要明确知道数据的来源,只需要接收到数据即可


使用该构造方法在创建DatagramPacket对象时,不仅指定了封装数据的字节数组和数据的大小,还指定了数据包的目标IP地址(addr)和端口号(port)。该对象通常用于发送端,因为在发送数据时必须指定接收端的IP地址和端口号,就好像发送货物


的集装箱上面必须标明接收人的地址一样

上面我们讲解了DatagramPacket的构造方法,接下来对DatagramPacket类中的常用方法进行详细地讲解,如下表所示


DatagramSocket

DatagramPacket数据包的作用就如同是“集装箱”,可以将发送端或者接收端的数据封装起来。然而运输货物只有“集装箱”是不够的,还需要有码头。在程序中需要实现通信只有DatagramPacket数据包也同样不行,为此JDK中提供的一个DatagramSocket类。DatagramSocket类的作用就类似于码头,使用这个类的实例对象就可以发送和接收DatagramPacket数据包,发送数据的过程如下图所示


在创建发送端和接收端的DatagramSocket对象时,使用的构造方法也有所不同,下面对DatagramSocket类中常用的构造方法进行讲解

该构造方法用于创建发送端的DatagramSocket对象,在创建DatagramSocket对象时,并没有指定端口号,此时,系统会分配一个没有被其它网络程序所使用的端口号



该构造方法既可用于创建接收端的DatagramSocket对象,又可以创建发送端的DatagramSocket对象,在创建接收端的DatagramSocket对象时,必须要指定一个端口号,这样就可以监听指定的端口

上面我们讲解了DatagramSocket的构造方法,接下来对DatagramSocket类中的常用方法进行详细地讲解


UDP网络程序


要实现UDP通信需要创建一个发送端程序和一个接收端程序,很明显,在通信时只有接收端程序先运行,才能避免因发送端发送的数据无法接收,而造成数据丢失。因此,首先需要来完成接收端程序的编写

  • UDP完成数据的发送
/*
     *发送端
     * 1,创建DatagramSocket对象
     * 2,创建DatagramPacket对象,并封装数据
     * 3,发送数据
     * 4,释放流资源
     */
    public class UDPSend {
      public static void main(String[] args) throws IOException {
        //1,创建DatagramSocket对象
        DatagramSocket sendSocket = new DatagramSocket();
        //2,创建DatagramPacket对象,并封装数据
        //public DatagramPacket(byte[] buf, int length, InetAddress address,  int port)
        //构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
        byte[] buffer = "hello,UDP".getBytes();
        DatagramPacket dp = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("10.0.142.9"), 6666);
        //3,发送数据
        //public void send(DatagramPacket p) 从此套接字发送数据报包
        sendSocket.send(dp);
        //4,释放流资源
        sendSocket.close();
      }
    }
复制代码


  • UDP完成数据的接收
/*
     * UDP接收端
     * 
     * 1,创建DatagramSocket对象
     * 2,创建DatagramPacket对象
     * 3,接收数据存储到DatagramPacket对象中
     * 4,获取DatagramPacket对象的内容
     * 5,释放流资源
     */
    public class UDPReceive {
      public static void main(String[] args) throws IOException {
        //1,创建DatagramSocket对象,并指定端口号
        DatagramSocket receiveSocket = new DatagramSocket(6666);
        //2,创建DatagramPacket对象, 创建一个空的仓库
        byte[] buffer = new byte[1024*64];
        DatagramPacket dp = new DatagramPacket(buffer, 1024);
        //3,接收数据存储到DatagramPacket对象中
        receiveSocket.receive(dp);
        //4,获取DatagramPacket对象的内容
        //谁发来的数据  getAddress()
        InetAddress ipAddress = dp.getAddress();
        String ip = ipAddress.getHostAddress();//获取到了IP地址
        //发来了什么数据  getData()
        byte[] data = dp.getData();
        //发来了多少数据 getLenth()
        int length = dp.getLength();
        //显示收到的数据
        String dataStr = new String(data,0,length);
        System.out.println("IP地址:"+ip+ "数据是"+ dataStr);
        //5,释放流资源
        receiveSocket.close();
      }
    }
复制代码


相关文章
|
5天前
|
Java 机器人 大数据
如何在Java中进行网络编程:Socket与NIO
如何在Java中进行网络编程:Socket与NIO
|
4天前
|
安全 Java
|
8天前
|
数据采集 Java 开发者
JAVA网络编程深度探索:URL与URLConnection的精湛技艺
Java网络编程核心在于URL和URLConnection。URL是资源的唯一标识,用于定位网络资源,支持解析、编码解码及参数操作。URLConnection则实现数据交换,允许GET/POST请求,可定制请求头、设置超时,是网络交互的关键。两者结合,适用于网络爬虫等场景,深入学习能提升编程技巧并揭示网络编程奥秘。
|
7天前
|
网络协议 Java 程序员
TCP/IP协议栈是网络通信基础,Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用
【6月更文挑战第23天】 **TCP/IP协议栈是网络通信基础,它包含应用层(HTTP, FTP等)、传输层(TCP, UDP)、网络层(IP)、数据链路层(帧, MAC地址)和物理层(硬件信号)。Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用,如Socket和ServerSocket用于客户端和服务器通信。**
20 3
|
1天前
|
Java API
Java网络编程实战指南与示例代码
Java网络编程实战指南与示例代码
|
2天前
|
Java Spring
Java中的网络编程实践指南
Java中的网络编程实践指南
|
3天前
|
小程序 Java 关系型数据库
基于Java网络商城系统设计和实现(源码+LW+调试文档+讲解等)
基于Java网络商城系统设计和实现(源码+LW+调试文档+讲解等)
|
5天前
|
Java 机器人 程序员
如何在Java中进行网络编程?
如何在Java中进行网络编程?
|
5天前
|
SQL 安全 Java
Java中的网络安全与防护技巧
Java中的网络安全与防护技巧
|
6天前
|
Java API UED
如何在Java中进行网络编程?
如何在Java中进行网络编程?