【DAY23】

文章目录

    • 【DAY23】
      • 一.网络编程
        • 1)三要素
        • 1.1)IP
        • InetAddress类的使用
        • 1.2)端口号
        • 1.3)协议
        • 2.1)UDP协议发送数据
        • 2.2)UDP协议接收数据
        • 2.3)UDP的三种通信方式
        • 3.1)TCP协议的发送和接收
        • 3.2)中文乱码问题
        • 3.3)三次握手四次挥手
      • 二.反射
        • 1)概述
        • 2)获取class对象的三种方式
        • 3)反射获取构造方法
        • 4)反射获取成员变量
        • 5)反射获取成员方法
      • 三.动态代理

一.网络编程

在通信协议下不同计算机上运行的程序,进行的数据传输

应用场景:计算机跟计算机之间通过网络

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

常见的软件架构

  • CS:Client/Server 在用户本地需要下载并安装客户端程序,在远程有一个服务端程序 eg:QQ
    • 优点:画面精美,用户体验好
    • 缺点:需要开发客户端也需要开发服务端。用户需要下载和更新
  • BS:Browser/Server 只需要一个浏览器,用户通过不同网址,客户访问不同的服务器 eg:淘宝
    • 优点:不需要开发客户端,只需要页面+服务端,用户不需要下载打卡浏览器就能使用
    • 缺点:如果应用过大,用户体验受到影响
1)三要素

IP:设备在网络中的地址,是唯一的表示

端口号:应用程序在设备中的唯一表示

协议:数据在网络中传输的规则,常见的协议有UDP,TCP,http,ftp

1.1)IP

互联网协议地址,上网设备在网络中的地址是分配给上网设备的数字标签

分类

  1. IPv4互联网通信协议第四版

    采用32位地址长度,分为4组,最多只有2^32个IP,2019年11.26全部分配完毕

    可以用局域网解决IP不够的问题

    在这里插入图片描述

  2. IPv6互联网通信协议第六版

    采用128位地址长度,分为8组 ,最多有2^128个IP

在这里插入图片描述

IPv4的细节

1.分类:公网地址(万维网使用)和私有地址(区域网使用)

192.168开头的就是私有地址,范围为192.168.0.0—192.168.255.255,专门为组织机构内部使用

2.特殊IP地址:127.0.0.1,也可以是localhost:是回送地址也称本地回送地址,也称本机IP,永远只会寻找当前所在本机

常用的CMD

  • ipconfig:查看本机IP地址
  • ping:检查网络是否连通
InetAddress类的使用

表示IP地址

方法说明
static InetAddress getByName(String host)确定主机名称的IP地址,主机名称可以是机器名称也可以是IP地址
String getHostName()获取此IP地址的主机名
String getHostAddress()返回文本显示的IP地址字符串
public class t1 {public static void main(String[] args) throws UnknownHostException {//1.获取InetAddress的对象InetAddress address = InetAddress.getByName("LAPTOP-K3EOH2DK");//"设备名"System.out.println(address);//LAPTOP-K3EOH2DK/192.168.1.32String name = address.getHostName();System.out.println(name);//LAPTOP-K3EOH2DKString ip = address.getHostAddress();System.out.println(ip);//192.168.1.32}
}
1.2)端口号

应用程序在设备中唯一的标识

有两个字节表示的整数,取值范围:065535,其中01023之间的端口号用于一些知名的网络访问或者应用

一个端口号只能被一个应用程序使用

1.3)协议

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

  • OSI参考模型:世界互联协议标准,全球通信规范,单模型过于理想化,未能在因特网上进行广泛推广
  • TCP/IP参考模型(或TCP/IP协议):事实上的国际标准

在这里插入图片描述

在这里插入图片描述

UDP协议

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

TCP协议

  • 传输控制协议
  • TCP是面向连接通信协议,速度慢,没有大小限制,数据安全
2.1)UDP协议发送数据

在这里插入图片描述

public class t1 {public static void main(String[] args) throws IOException {//1.创建对象//绑定端口号,通过这个端口往外发送//空参:所有可能的端口中随机一个进行使用//有参:指定端口号进行绑定DatagramSocket ds = new DatagramSocket();//2.打包数据String str = "你好你好你好你好你好";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("192.168.1.32");int port = 10086;//端口号DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//3.发送数据ds.send(dp);//4.释放数据ds.close();}
}
2.2)UDP协议接收数据

在这里插入图片描述

public class T2 {public static void main(String[] args) throws IOException {//1.创建DatagramSocketDatagramSocket ds = new DatagramSocket(10086);//2.接收数据包byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);ds.receive(dp);//3.解析数据包byte[] data = dp.getData();int len = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("接收到数据" + new String(data,0,len));System.out.println("该数据是从" + address + "这台电脑中的" + port + "这个接口发出的");//4.释放数据ds.close();}
}

先运行接收端再运行发送端

2.3)UDP的三种通信方式
  1. 单播

    一对一

  2. 组播

    一对组

    组播地址:224.0.0.0~239.255.255.255 其中224.0.0.0~224.0.0.255为预留的组播地址

  3. 广播

    一对局域网中的所有设备

    广播地址:255.255.255.255

组播

public class t1 {public static void main(String[] args) throws IOException {//组播//1.创建对象MulticastSocket ms = new MulticastSocket();//2.打包数据String str = "你好你好你好你好你好";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("224.0.0.1");int port = 10000;//端口号DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//3.发送数据ms.send(dp);//4.释放数据ms.close();}
}
public class T2 {public static void main(String[] args) throws IOException {//1.创建对象MulticastSocket ms = new MulticastSocket(10000);//2.将当前本机添加到224.0.0.1的这一组中InetAddress adress = InetAddress.getByName("224.0.0.1");ms.joinGroup(adress);//3.接收数据包byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);ms.receive(dp);//4.解析数据包byte[] data = dp.getData();int len = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("接收到数据" + new String(data,0,len));System.out.println("该数据是从" + address + "这台电脑中的" + port + "这个接口发出的");//5.释放数据ms.close();}
}

广播

public class t1 {public static void main(String[] args) throws IOException {//组播//1.创建对象MulticastSocket ms = new MulticastSocket();//2.打包数据String str = "你好你好你好你好你好";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("255.255.255.255");int port = 10000;//端口号DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//3.发送数据ms.send(dp);//4.释放数据ms.close();}
}
3.1)TCP协议的发送和接收

在这里插入图片描述

客户端

  1. 创建客户端的对象Socket对象(Socket)与自动服务器端连接

    Socket(String host,int port)

  2. 获取输出流,写数据

    OutputStream getOutputStream()

  3. 释放数据

    void close()

服务器

  1. 创建服务器端的Socket对象(ServerSocket)

    ServerSocket(int port)

  2. 监听客户端连接,返回一个Socket对象

    Socket accept()

  3. 获取输入流,读数据,并把数据显示在控制台

    InputStream getInputStream()

  4. 释放资源

    void close()

客户端

public class t1 {public static void main(String[] args) throws IOException {//1.创建对象Socket socket = new Socket("192.168.1.32",10086);//2.从连接通道中获取输出流OutputStream os = socket.getOutputStream();//写出数据os.write("你好你好你好你好你好".getBytes());//3.释放数据os.close();socket.close();}
}

服务端

public class T2 {public static void main(String[] args) throws IOException {//1.创建对象ServerSocket ss = new ServerSocket(10086);//2.监听客户端的连接Socket socket = ss.accept();//3.从连接通道中获取输入流读取数据InputStream is = socket.getInputStream();int b;while((b = is.read()) != -1) {System.out.println((char)b);}//4.释放资源socket.close();ss.close();}
}
3.2)中文乱码问题

乱码原因:一个中文三个字节,InputStream字节流一个一个字节读所有造成乱码

解决方法:用转换流把字节流转换为字符流

public class T2 {public static void main(String[] args) throws IOException {//1.创建对象ServerSocket ss = new ServerSocket(10086);//2.监听客户端的连接Socket socket = ss.accept();//3.从连接通道中获取输入流读取数据InputStream is = socket.getInputStream();InputStreamReader isr = new InputStreamReader(is);int b;while((b = isr.read()) != -1) {System.out.print((char)b);}//4.释放资源isr.close()socket.close();ss.close();}
}
3.3)三次握手四次挥手

在这里插入图片描述

在这里插入图片描述

二.反射

1)概述

反射允许对封装类的字段,方法和构造函数的信息进行编程访问

在这里插入图片描述

2)获取class对象的三种方式
  1. Class.forName(“全类名”);

    最常用

  2. 类名.class

    一般更多是当做参数进行传递

  3. 类名.getClass();

    当已经有了这个类的对象时才能使用

public class t1 {public static void main(String[] args) throws IOException, ClassNotFoundException {//1.法一//全类名:包名 + 类名Class clazz1 = Class.forName("T1.Student");//2.法二Class clazz2 = Student.class;//3.法三Student s = new Student();Class clazz3 = s.getClass();}
}
3)反射获取构造方法

在这里插入图片描述

在这里插入图片描述

public class t1 {public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException {//1.获取class字节码文件对象Class clazz = Class.forName("T1.Student");//2.获取构造方法Constructor[] cons = clazz.getConstructors();for (Constructor con : cons) {System.out.println(con);}Constructor[] cons2 = clazz.getDeclaredConstructors();for (Constructor con2 : cons2) {System.out.println(con2);}//获取单个Constructor con1 = clazz.getDeclaredConstructor();System.out.println(con1);Constructor con2 = clazz.getDeclaredConstructor(String.class);System.out.println(con2);}
}
4)反射获取成员变量

在这里插入图片描述

public class t1 {public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, NoSuchFieldException {//1.获取class字节码文件对象Class clazz = Class.forName("T1.Student");//2.获取成员变量Field[] fields = clazz.getFields();for (Field field : fields) {System.out.println(field);}Field[] fields2 = clazz.getDeclaredFields();for (Field field2 : fields2) {System.out.println(field2);}//获取单个Field name = clazz.getDeclaredField("name");//获取权限修饰符int modifiers = name.getModifiers();System.out.println(modifiers);}
}
5)反射获取成员方法

在这里插入图片描述

三.动态代理

特点:无侵入式的给代码增加额外的功能

为什么需要代理对象如果要干的事情太多可以通过代理转移部分职责

代理长什么样对象有什么方法想被代理,代理就一定要有相应的方法

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】从普通进程到守护进程:系统服务的诞生之路

当你在深夜关闭SSH终端,为何Web服务器仍在默默响应请求?这背后是守护进程的魔法在守护着系统服务的不灭之火。一、守护进程的六大核心特征守护进程(Daemon)是Linux系统的无名英雄,它们舍弃了普通进程的"世俗享受&…

k8s常用基础命令总结

----------------------k8s常用基础命令--------------------------------- 获取 Pod 信息 # 1.获取k8s的命名空间 kubectl get namespaces ​1)获取 Pod 列表及简要信息: kubectl get pods 2)以 YAML 格式获取 Pod 详细信息: kubectl get pod -o yaml 3)​获取特定命名空间中…

Java高级之基于Java Attach与Byte-Buddy实现SQL语句增强

目录 一 Agent 模块 1 HookAgent.java 2 FormatAdvice.java 3 配置文件 二 Attacher 模块 1 AttachMain.java 三 测试模块 1 DruidTest.java 四 验证步骤 五 原理解析 笔者目标写一款数据分析中间件,用来增强当前主流开源项目,前几天写了一票用…

2025第五届生物发酵营养源高峰论坛

一、会议时间会议时间:2025年8月8日二、会议地点上海新国际博览中心–W4馆现场2号会议室三、组织单位主办单位:中国生物发酵产业协会承办单位:浙江工业大学乐斯福集团Procelys 乐斯福发酵营养元参会福利,助力高效交流为提升参会体验,组委会特别推出多项福…

Kubernetes 配置管理

这里写目录标题什么是 ConfigMap创建 ConfigMap基于目录创建 ConfigMap创建 conf 目录,里面放置两个文件基于目录下的所有文件创建 ConfigMap查看当前创建的 ConfigMap基于文件创建 ConfigMap创建测试文件 game-cfg基于单个文件创建 ConfigMap查看当前创建的 Config…

ESP32+MicroPython:用Python玩转物联网开发

什么是ESP32? ESP32作为当下最热门的物联网开发板,常被比作"嵌入式世界的瑞士军刀"。但很多初学者会混淆芯片、模组和开发板的概念,其实它们的关系很简单: 芯片(Soc):核心处理器,如ESP32-D0WD模…

opencv学习(图像金字塔)

1.什么是图像金字塔图像金字塔是一种多尺度图像表示方法,通过对原始图像进行下采样(缩小)和上采样(放大),生成一系列不同分辨率的图像集合,形似 “金字塔”(底部是高分辨率原始图像&…

从 C# 到 Python:项目实战第五天的飞跃

在前面三天的学习中,我们已经掌握了 Python 的基础语法、数据结构以及一些核心库的使用。今天,我们将通过三个实战项目,深入对比 C# 和 Python 在命令行工具开发、Web 应用开发以及数据处理方面的差异,感受 Python 在实际项目中的…

rabbitmq 03

一、mq的作用和使用场景 MQ的基本作用 MQ(Message Queue,消息队列)是一种应用程序对应用程序的通信方法,主要作用包括: 异步处理:解耦生产者和消费者,允许生产者发送消息后立即返回&#xff0…

Ubuntu 24.04 显示中文+使用中文键盘

ubuntu 24.04 中文显示中文键盘Ubuntu中文输入重启iBus服务Ubuntu中文输入 安装的Ubuntu24.04,一般默认是英文的,要使用中文的话,可以通过命令行设置,也可以使用‘设置’,在图形化界面中操作。 下面是在‘设置’的图形…

Docker实战:Tomcat容器从部署到自定义网页的完整操作

Docker实战:Tomcat容器从部署到自定义网页的完整操作 继Nginx容器部署后,我们再来实操Tomcat容器的使用——从拉取镜像、启动容器,到端口映射、网页挂载,全程通过实际命令演示,带你掌握Tomcat在Docker中的核心用法。 一…

使用cherry studio离线搭建私人知识库流程记录

本篇文章记录近期尝试在个人笔记本上、全离线状态下搭建知识库的流程。用到的工具包括:Cherry Studio、ollama。主要过程是:首先下载ollama用于管理大模型;然后,从魔塔社区下载需要的deepseek、千问大模型和bge-m3嵌入模型&#x…

【工具类】Linux 环境利用 uv 安装多版本 python

文章目录前置工作环境说明如果kali无法访问网络pypi 换源安装 uvuv 写入环境变量临时写入永久写入无法打开 github 解决方案(注意此方法可能也会失效)安装多版本 python查看已安装的pythonuv python install到 uv 的 github 主页,找安装文件下…

求职招聘小程序源码招聘小程序开发定制

身份:求职者、企业求职者:完善简历,简历投递企业:企业入驻,查看简历企业会员:半年 、年度 权益:每日发布条数、刷新条数,简历下载数量聊天:求职者可以和企业聊天招聘会…

Git 使用全指南:从配置到免密登录

Git 使用全指南:从配置到免密登录一、Git 基础配置二、Git 代码提交流程2.1 克隆远程仓库2.2 创建并切换分支2.3 暂存文件2.4 提交到本地仓库2.5 拉取远程最新代码2.6 推送本地分支到远程三、VSCode 服务器免密登录配置3.1 生成 Windows SSH 密钥3.2 复制公钥到服务…

组合期权:领式策略

文章目录0.简介1.多头领式策略(Long Collar)​1.1 策略构成1.2 适用场景​1.3 损益分析1.4 案例示范2.空头领式策略(Short Collar)​2.1 策略构成2.2 适用场景2.3 损益分析2.4 案例示范参考文献0.简介 领式策略(Colla…

ECSPI控制器

目录 SPI协议简介 极性与相位 SPI框图 单字节收发 发送数据流程 接收数据流程 ECSPI控制器 关键特性 时钟源 主机模式 等待状态 片选控制 单突发传输 多突发传输 相位控制 ECSPI Memory Map ECSPI寄存器 ECSPIx_RXDATA ECSPIx_TXDATA ​编辑 ECSPIx_CONREG …

HTTP 与 SpringBoot 参数提交与接收协议方式

HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Type)。以下是主要的参数提交协议:1. URL 查询参数 (Query Parameters)请求方法: GET (也可用于其他方法)格式: ?key1value1&key2value2示例: GET /users?id123&…

Lua(数组)

Lua 数组基础概念Lua 中的数组实际上是用整数索引的 table,是一种特殊形式的表。数组索引通常从 1 开始(Lua 惯例),但也可以从其他值开始。创建数组通过表构造器初始化数组:-- 索引从 1 开始的数组 local arr {10, …

【Docker项目实战】在Docker环境下部署go-file文件分享工具

【Docker项目实战】在Docker环境下部署go-file文件分享工具一、go-file介绍1.1 go-file简介1.2 go-file特点1.3 go-file使用场景二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下…