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

news2024/11/27 0:26:28

在这里插入图片描述

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

在这里插入图片描述

Java网络编程

  • 什么是网络编程?Java如何实现?三次握手和四次挥手?
    • 1. 什么是网络编程
    • 2. 网络编程三要素
      • `IP`
      • `端口号`:
      • `协议`:
        • ⚪ UDP协议
        • ⚪ TCP协议
          • · 三次握手和四次挥手
    • 3. InetAddress类


什么是网络编程?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)

  • ③发送数据

  • ④释放资源

  • /**
     * @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对象

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

  • ③解析数据包

  • ④释放资源

  • /**
     * @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();
        }
    }
    
  • 输出:

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

UDP的三种通信方式

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

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

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

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

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

      • 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()
  • /**
     * @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()
  • /**
     * @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地址字符串。

  • /**
     * @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
        }
    }
    
    



在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1122429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PAM从入门到精通(二十)

接前一篇文章:PAM从入门到精通(十九) 本文参考: 《The Linux-PAM Application Developers Guide》 先再来重温一下PAM系统架构: 更加形象的形式: 七、PAM-API各函数源码详解 前边的文章讲解了各PAM-API函…

SAP MM学习笔记38 - 入库/请求自动决济(ERS - Evaluated Receipt Settlement)

之前的章节学习了请求书的方方面面,这一章来个终章,入库/请求自动决济:)。 1,什么是 ERS ERS,即 入库/请求自动决济,是 自動決済(Automatic Settlement)功能的一种。 以…

深入理解C++红黑树的底层实现及应用

文章目录 1、红黑树简介1.1 、概述:介绍红黑树的定义、特点和用途。 2、红黑树节点的定义3、红黑树结构3.1、红黑树的插入操作 4、红黑树的验证4.1、红黑树的删除4.2、红黑树与AVL树的比较4.3、红黑树的应用 5、总结 1、红黑树简介 1.1 、概述:介绍红黑…

视频剪辑教程:批量修改视频尺寸的简单方法

如果您需要批量修改大量视频的尺寸,这是一项繁琐且耗时的任务。但是,使用固乔剪辑助手,您可以通过简单的几个步骤轻松实现这一需求。下面是如何使用固乔剪辑助手来批量修改视频尺寸的步骤: 步骤1:导入视频素材 首先&am…

【Solidity】智能合约案例——②供应链金融合约

目录 一、合约源码分析: 二、合约整体流程: 1.部署合约: 2.添加实体 3.发送交易存证 ①.银行向公司交易(公司向银行提供交易存证) ②.公司向银行交易(银行向公司提供交易存证) ③.公司向公司交…

git(部分)

1、git三个区域:工作区,暂存区,版本库 2、git文件状态:未跟踪,已跟踪(新添加,未修改,已修改) 如何查看暂存区和工作区文件状态:git status -s 3、查看版本记…

【Java】Java 17 新特性概览

Java 17 新特性概览 1. Java 17 简介2. Java 17 新特性类型推断 - 新的 var 关键字垃圾回收器改进JEP 356 增强的伪随机数生成器(1)提供了一个新接口 RandomGenerator(2)提供了一个新类 RandomGeneratorFactory(3&…

高校教务系统登录页面JS分析——西安科技大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文,你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习,勿用于非法用途。 一、密码加…

42908-2023 纺织染整助剂产品中有机卤素含量的测定

1 范围 本文件描述了纺织染整助剂产品中有机卤素含量的测定方法。 本文件适用于各类纺织染整助剂中有机卤素含量的测定,包括有机氟、有机氯、有机溴。 2 规范性引用文件 下列文件中的内容通过文中的规范性引用而构成本文件必不可少的条款。其中,注日…

自然语言处理---Transformer模型

Transformer概述 相比LSTM和GRU模型,Transformer模型有两个显著的优势: Transformer能够利用分布式GPU进行并行训练,提升模型训练效率。 在分析预测更长的文本时,捕捉间隔较长的语义关联效果更好。 Transformer模型的作用 基于seq…

香港科技大学广州|先进材料学域博士招生宣讲会—上海专场!!!(暨全额奖学金政策)

香港科技大学广州|先进材料学域博士招生宣讲会—上海专场!!!(暨全额奖学金政策) “跨学科融合创新,引领新兴与未来行业的突破与发展——先进材料学域” ���…

深入理解多线程编程和 JVM 内存模型

文章目录 1. 理解进程和线程的概念进程(Process)线程(Thread) 2. 理解竞态条件和死锁竞态条件(Race Condition)死锁(Deadlock) 3. JVM 内存模型堆(Heap)栈&am…

正规文法、正规式、确定的有穷自动机DFA、不确定的有穷自动机NFA 的概念、区分以及等价性转换【我直接拿下!】

文章目录 正规文法正规式有穷自动机确定的有穷自动机——DFA不确定的有穷自动机——NFADFA 与 NFA 的区分 正规式转换为正规文法正规文法转换为正规式NFA 转换为 DFANFA 最小化 NFA 转换为正规式正规式转换为 NFA正规文法转换为 NFANFA 转换为正规文法 前言: 在学习…

C语言--程序环境和预处理(宏)

目录 前言 本章重点: 1. 程序的翻译环境和执行环境 2. 详解编译链接 2.1 翻译环境​编辑 2.2 编译本身也分为几个阶段 2.3 运行环境 3. 预处理详解 3.1 预定义符号 3.2 #define 3.2.1 #define 定义标识符 3.2.2 #define 定义宏 2.2.3 #define 替换规则 …

fetch网络请求详解

一:三种常见的网络请求对比: AJAX:基于XMLHttpRequest收发请求,使用较为繁琐,代码量会比较多axios:基于promise的请求客户端,在浏览器和node中均可使用,使用便捷,功能强…

系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第五部分:支付系统

本心、输入输出、结果 文章目录 系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第五部分:支付系统前言如何学习支付系统信用卡为什么被称为“银行最赚钱的产品”?VISA/万事达卡如何赚钱?步骤说明为什么开证行应该得到补偿 当我们在商家…

Linux中的开发工具(yum,vim,gcc/g++,gdb,Makefile,git)

文章目录 1. Linux软件包管理器——yumyum 语法yum 常用命令安装 yum 仓库源 2. Linux编辑器——vimvim 的五种常用模式模式切换vim 基本操作命令模式命令集(1)光标命令(2)复制粘贴命令(3)撤销与重做&#…

深度学习---卷积神经网络

卷积神经网络概述 卷积神经网络是深度学习在计算机视觉领域的突破性成果。在计算机视觉领域。往往输入的图像都很大,使用全连接网络的话,计算的代价较高。另外图像也很难保留原有的特征,导致图像处理的准确率不高。 卷积神经网络&#xff0…

安全多方计算框架最全合集(持续更新)

安全多方计算框架 本文对现有安全多方计算/学习框架进行了全面、系统的梳理。 目前大部分安全多方计算框架主要基于秘密共享、同态加密、混淆电路以及相关基本模块的组合。通常使用定制的协议来支持特定数量的参与方(一般为两方或三方),导致…