什么是网络编程?Java如何实现?三次握手和四次挥手?

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~

个人主页:.29.的博客

学习社区:进去逛一逛~

Java网络编程


什么是网络编程?Java如何实现?三次握手和四次挥手?

1. 什么是网络编程

网络编程

  • 网络编程,就是指在网络通信协议下,不同计算机运行的程序,进行的数据传输,即:计算机与计算机之间,通过网络进行数据传输。

    • Java中可以使用java.net包下的技术轻松开发出常见的网络应用程序。

常见的软件架构

  • C/S架构:Client/Server -- 客户端/服务器,在用户本地需要下载并安装客户端程序,在远程有一个服务器程序。
  • B/S架构:Browser/Server -- 浏览器/服务器,只需要一个浏览器,用户通过不同的网址,访问不同的服务器。
    • BS架构 优缺点:
      • ①不需要开发客户端,只需要页面 + 服务端
      • ②用户不需要下载,打开浏览器就能使用
      • ③如果应用过大,用户体验受到影响(缺)
    • CS架构 优缺点:
      • ①画面可以做的十分精美,用户体验好
      • ②需要开发客户端,也需要开发服务端(缺)
      • ③用户需要下载和更新,麻烦(缺)

2. 网络编程三要素

网络编程三要素

  • IP:设备在网络中的地址,是唯一的标识。
  • 端口号:应用程序在设备中唯一的标识。
  • 协议:数据在网络中传输的规则,常见:UDP、TCP、http、https、ftp。

IP

  • IP全称:Internet Protocol,互联网协议地址,也称IP地址,是分配给网上设备的数字标签。

  • IPv4:Internet Protocol version 4,互联网通信协议第四版。

    • 采用32位地址长度,分成四组,每组范围0~255。
    • 最多有2^32个ip,目前已用完。
    • 192.168.开头是私有地址,范围在192.168.0.0 -- 192.168.255.255,专供组织机构内部局域网使用。
  • IPv6: Internet Protocol version 6,互联网通信协议第六版。

    • 采用128位地址长度,分为8组。
    • 最多有2^128个ip,正是为了解决IPv4不够用而出现的。

端口号

  • 端口号:应用程序在设备中唯一的标识
    • 端口号是由两个字节表示的整数,取值范围:0 ~ 65535,其中0 ~ 1023之间的端口号用于一些知名的网络服务或者应用,平常使用可以使用1024以上的端口号。
    • == 注意:一个端口号只能被一个应用程序使用。 ==

协议

  • 计算机网络中,连接和通信的规则被称为网络通信协议。

  • OSI参考模型:世界互联协议标准,全球通信规范,模型过于理想化,未能在因特网上进行广泛推广。

  • TCP/IP参考模型(TCP/IP协议):事实上的国际标准

⚪ UDP协议

UDP协议

  • 用户数据报协议(User Datagram Protocol)
  • UDP是面向无连接通信协议。
    • 速度快,但大小限制一次最多发送64K,数据不安全,数据易丢失。

UDP通信程序

  • 发送数据:

  • ① 创建发送端的DatagramSocket对象

    • 可以通过传入参数,指定绑定的端口。
  • ②数据打包(DatagramPacket)

  • ③发送数据

  • ④释放资源

java 复制代码
/**
 * @author .29.
 * @create 2023-10-20 16:44
 */
public class UDPSendM {
    public static void main(String[] args) throws IOException {
        //1. 创建DatagramSocket对象
        // 绑定端口:通过绑定的端口向外发送数据
        //空参:随机选取所有可用端口中的一个来绑定
        //带参:指定端口号进行绑定
        DatagramSocket datagramSocket = new DatagramSocket();

        //2. 打包数据
        String str = "这是使用UDP协议发送的数据";//数据
        byte[] bytes = str.getBytes();        //转换成字节数组
        InetAddress address = InetAddress.getByName("127.0.0.1"); //向这个主机地址发送数据
        int port = 10086; //向这个端口发送数据
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, address, port);

        //3. 发送数据
        datagramSocket.send(datagramPacket);

        //4.关闭资源
        datagramSocket.close();
    }
}
  • 接收数据:

  • ①创建DatagramSocket对象

    • 一定要绑定端口,端口需要与发送程序的目标端口保持一致!
  • ②接受打包好的数据

  • ③解析数据包

  • ④释放资源

java 复制代码
/**
 * @author .29.
 * @create 2023-10-20 17:10
 */
public class UDPReceiveM {
    public static void main(String[] args) throws IOException {
        //1. 创建DatagramSocket对象,必须绑定端口号,并与发送程序的目标端口一致
        DatagramSocket datagramSocket = new DatagramSocket(10086);

        //2. 接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
        //receive()是阻塞的,在接收到数据前会一直等待
        datagramSocket.receive(datagramPacket);

        //3. 解析数据
        byte[] data = datagramPacket.getData(); //传输的数据
        InetAddress address = datagramPacket.getAddress();//传输的地址
        int length = datagramPacket.getLength();//数据长度
        int port = datagramPacket.getPort();//传输的端口号
        System.out.println("接收到的数据:" + new String(data,0,length));
        System.out.println("数据从端口" + port + "地址" + address + "发来");

        //4. 释放资源
        datagramSocket.close();
    }
}
  • 输出:

bash 复制代码
接收到的数据:这是使用UDP协议发送的数据
数据从端口50584地址/127.0.0.1发来

UDP的三种通信方式

  • ①单播: 一对一进行数据传输

    • 上述通信程序采用的就是单播方式。
  • ②组播: 一对多进行数据传输

    • 组播地址:224.0.0.0 ~ 239.255.255.255,其中224.0.0.0 ~ 224.0.0.225是预留的组播地址。

    • 发送端: 第一步创建的是MulticastSocket对象,之后打包数据时目标地址改为组播地址,其余与单播一致。

      java 复制代码
      MulticastSocket ms = new MulticastSocket();
    • 接收端: 第一步创建的是MulticastSocket对象,之后将当前机器添加绑定到发送端的目标组播地址中去:

      java 复制代码
      MulticastSocket ms = new MulticastSocket(10000);
      //获取组播地址的对象
      InetAddress address = InetAddress.getByName("224.0.0.1");
      //MulticastSocket对象添加绑定到组播地址
      ms.joinGroup(address);
  • ③广播: 向所有机器进行数据传输

    • 广播地址:225.225.225.225
    • 实现广播,只需要在单播的发送端基础上,将目标地址改为广播地址的225.225.225.225。

⚪ TCP协议

TCP协议

  • 传输控制报协议(Transmission Control Protocol)
  • UDP是面向连接通信协议。
    • 虽速度慢,但没有大小限制,且数据安全。

TCP通信程序

  • TCP协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,通信之前要保证连接已经建立,通过Socket产生IO流来进行网络通信。

  • 客户端:

    • ①创建客户端的Socket对象(Socket),与指定服务端连接
      • Socket(String host,int port)
    • ②获取输出流,写数据
      • OutputStream getOutputStream()
    • ③释放资源
    • void close()
java 复制代码
/**
 * @author .29.
 * @create 2023-10-20 20:14
 */
public class TCPClient {
    public static void main(String[] args) throws IOException {
        //1. 创建Socket对象,与服务端建立连接
        Socket socket = new Socket("127.0.0.1", 10000);

        //2. 获取字节输出流
        OutputStream outputStream = socket.getOutputStream();

        //3. 发送数据
        String s = "这边是客户端,你好呀服务端!";
        outputStream.write(s.getBytes());

        //4. 关闭资源
        outputStream.close();
        socket.close();

    }
}
  • 服务端:

  • ①创建服务端的Socket对象(ServerSocket)

    • ServerSocket(int port)
  • ②监听客户端连接,返回一个Socket对象

    • Socket accept()
  • ③获取输入流,读数据,并显示

    • InputStream getInputStream()
  • ④释放资源

    • void close()
java 复制代码
/**
 * @author .29.
 * @create 2023-10-20 20:17
 */
public class TCPServer {
    public static void main(String[] args) throws IOException {
        //1. 获取服务端Socket对象,端口号与客户端目标端口号一致
        ServerSocket serverSocket = new ServerSocket(10000);

        //2. 返回一个Socket对象
        Socket accept = serverSocket.accept();

        //3. 获取字节输入流
        InputStream inputStream = accept.getInputStream();
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);

        //4. 获取数据,显示
        int i;
        System.out.println("接收到数据:");
        while((i = inputStreamReader.read()) != -1){
            System.out.print((char)i);
        }

        //5. 释放资源
        inputStreamReader.close();
        accept.close();
        serverSocket.close();

    }
}
· 三次握手和四次挥手

三次握手(确保连接建立)

  • ①客户端首先会向服务器发送连接请求,之后开始等待,等待服务器确认。
  • ②服务器接收到请求后,向客户端返回一个响应,告诉客户端收到请求了。
  • ③得到服务器确认后,再次向服务器发送确认信息,建立连接。

四次挥手(确保连接断开,且数据处理完毕)

  • ①客户端首先向服务器发送取消连接的请求,而后等待响应。
  • ②服务器向客户端返回一个响应,表示收到了取消连接的请求,之后服务器开始处理数据。
  • ③服务器将数据处理完毕后,再次向客户端发出确认取消信息。
  • ④客户端再次发送确认消息,连接取消。

3. InetAddress类

InetAddress类的使用

  • static InetAddress getByName(String host):获取主机名称的IP地址,主机名称可以是机器名称,也可以是IP地址。

  • String getHostName():获取此IP地址的主机名。

  • String getHostAddress():返回文本显示中的IP地址字符串。

java 复制代码
/**
 * @author .29.
 * @create 2023-10-20 15:51
 */
public class InetAddressDemo {
    public static void main(String[] args) throws UnknownHostException {
        //1. 获取InetAddress对象(一台设备的对象),传入的可以是IP地址,也可以是机器名称
        InetAddress inetAddress = InetAddress.getByName("LAPTOP-TB1IVJR9");
        System.out.println(inetAddress); // LAPTOP-TB1IVJR9/192.168.88.1

        InetAddress inetAddress2 = InetAddress.getByName("192.168.88.1");
        System.out.println(inetAddress2); // /192.168.88.1

        //2. 获取InetAddress对象的设备名称
        String hostName = inetAddress.getHostName();
        System.out.println(hostName); // LAPTOP-TB1IVJR9

        //3. 获取InetAddress对象的ip地址字符串
        String hostAddress = inetAddress.getHostAddress();
        System.out.println(hostAddress); // 192.168.88.1
    }
}

相关推荐
考虑考虑9 小时前
Jpa使用union all
java·spring boot·后端
用户3721574261359 小时前
Java 实现 Excel 与 TXT 文本高效互转
java
浮游本尊10 小时前
Java学习第22天 - 云原生与容器化
java
渣哥12 小时前
原来 Java 里线程安全集合有这么多种
java
间彧12 小时前
Spring Boot集成Spring Security完整指南
java
间彧12 小时前
Spring Secutiy基本原理及工作流程
java
Java水解13 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
洛小豆15 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学16 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole16 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端