构建一个最简单的UDP服务器和客户端并逐行解析
目录
1.服务器
(1)基本概念
(2)代码实现
3.逐行解析
1)
2)
3)
4)
5)
6)
7)
8)
1. response.getBytes():
2.response.getBytes().length:
3.requestPacket.getSocketAddress():
4.DatagramPacket responsePacket = new DatagramPacket
9)
10)
11)
2.客户端
(1)基本概念
(2)代码实现
(3)逐行解析
1)
2)
3)
4)
5)
6)
7)
8)
9)
10)
3.结果展示
在 Java 网络编程中,客户端(Client)和服务器(Server)是两个核心角色,它们共同构成了网络通信的基本模型(即 C/S 架构)。
以下我会逐行解析构建一个最简单的服务器和客户端的代码。
1.服务器
(1)基本概念
服务器是 接收请求 的一方,被动监听特定端口,处理客户端请求并返回响应。
典型场景:Web 服务器(如 Tomcat)、数据库服务器、游戏服务器等。
(2)代码实现
public class UdpEchServer {private DatagramSocket socket=null;public UdpEchServer(int port) throws SocketException {socket=new DatagramSocket(port);}public void start() throws IOException {System.out.println("服务器启动");while(true){/*1.读取请求并解析*/DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);socket.receive(requestPacket);String request=new String(requestPacket.getData(),0,requestPacket.getLength());//数组中有效的长度,避免只收到很少的数据却构建了很大的byte数组//2.根据请求,计算相应(一个服务器最关键的逻辑)String response=process(request);/*3.将响应返回给客户端*/DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);//4.打印一个日志System.out.printf("[%s:%d] request:%s, response:%s\n",requestPacket.getAddress().toString(), // 客户端IP地址requestPacket.getPort(), // 客户端端口号request, // 请求内容response // 响应内容);}}/*把根据请求计算响应的逻辑构建成了一个方法 */private String process(String request) {return request;}public static void main(String[] args) throws IOException {UdpEchoClient client = new UdpEchoClient("127.0.0.1", 9090);client.start();}}
3.逐行解析
1)
private DatagramSocket socket=null;
DatagramSock是UDP socket ,用于发送和接受数据包。
2)
public UdpEchServer(int port) throws SocketException {socket=new DatagramSocket(port);}
指定一个端口号(int port)给服务器使用。因为服务器的端口号不能一直变,所以直接指定固定端口号。
3)
while(true)
因为服务器通常是7*24小时不间断的读取请求的,所以通常会用一个while(true)这样的死循环来保证服务器持续工作。循环一次,就相当于读取一次请求。
4)
DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);
构建出一个用于接受请求数据报的DatagramPacket。
这里使用构造函数 DatagramPacket(byte[] buf, int length)
创建了一个 DatagramPacket
对象,其中:
byte[] buf
是用于存储接收到的数据的缓冲区。int length
是缓冲区的长度,表示可以接收的最大数据量。
5)
socket.receive(requestPacket);
这里将requestPacket作为输出型参数:
- 这一行代码是使用UDP套接字接收数据报的方法调用。
receive
方法会阻塞服务器进程,直到接收到一个数据报。 - 一旦接收到数据报,
requestPacket
将被填充接收到的数据、发送方的IP地址和端口号。
6)
String request=new String(requestPacket.getData(),0,requestPacket.getLength());
将读取到的二进制数据转换成字符串:
-
requestPacket.getData()
: 这个方法调用返回的是接收到的数据包中包含的字节数组。这个数组的大小是固定的(在此例中为4096字节),但其中只有部分是实际接收到的数据,所以还需要指定字节数组的有效长度。 -
requestPacket.getLength()
: 这个方法调用返回的是实际接收到的数据的长度,也就是有效长度。由于UDP数据包的大小是固定的,而实际传输的数据可能较少,因此getLength()
的值可能小于getData().length
。这个方法确保只处理实际接收到的数据,而不是整个4096字节的数组。 -
0
: 这是字节数组的偏移量,表示从数组的第0个位置开始读取数据。 -
new String(...)
: 这是一个构造函数调用,用于将字节数组转换为字符串。这里使用的是特定范围的字节数组(从偏移量0开始,长度为requestPacket.getLength()
)来创建字符串,而不是整个数组。
7)
String response=process(request);
这一段代码的含义是根据请求来作出响应,一般来说是一个服务器最关键的逻辑,但是此处的服务器是回显服务器,所以这个逻辑被省略了。
可以response=request,但是此处将做出相应的逻辑构建成了一个process方法,方便后续做其他服务器:
private String process(String request) {return request;}
8)
DatagramPacket responsePacket = new
DatagramPacket(response.getBytes(),response.getBytes().length,
requestPacket.getSocketAddress());
再次构建一个DatagramPacket对象作为发送给客户端的数据报:responsePacket。
1. response.getBytes()
:
- 这个方法将 前面接受reqest后得到的
String
类型的response
转换为byte[]
类型的数组。 getBytes()
方法会根据平台的默认字符集将字符串编码为字节数组。
2.response.getBytes().length
:
- 这里调用了
response.getBytes()
方法得到的字节数组的长度。 - 这个长度表示实际响应数据的总字节数,确保发送的数据报中只包含有效的响应内容。
长度要用response.getBytes().length,因为response是字符串,需要先转成二进制数组,才能获取到数组的长度 不能用response.length,因为response是字符串,字符串的长度是字符的个数,而不是二进制数组的长度
3.requestPacket.getSocketAddress()
:
- 这个方法用于获取发送请求的数据报(
requestPacket
)的源地址(SocketAddress
)。 SocketAddress
包含了客户端的 IP 地址和端口号信息,这样服务器就能知道将响应数据发送回哪个客户端。
4.DatagramPacket responsePacket = new DatagramPacket
- 这里创建了一个新的
DatagramPacket
对象,命名为responsePacket
。 - 构造函数
DatagramPacket(byte[] buf, int length, SocketAddress address)
的参数分别为:byte[] buf
: 要发送的数据的字节数组。int length
: 数据的有效长度。SocketAddress address
: 目标地址,即要发送到的客户端地址。
9)
socket.send(responsePacket);
发送数据包给客户端,由于前面使用了requestPacket.getSocketAddress()
方法将源ip、源端口号都传给了requestPacket,所以此处UDP已经知道了该发送给谁。
10)
System.out.printf("[%s:%d] request:%s, response:%s\n",requestPacket.getAddress().toString(), // 客户端IP地址requestPacket.getPort(), // 客户端端口号request, // 请求内容response // 响应内容);
打印一个日志,方便调试和监控。
11)
public static void main(String[] args) throws IOException {UdpEchoClient client = new UdpEchoClient("127.0.0.1", 9090);client.start();}
在main方法中实例化服务器,并指定了服务器的端口号是9090。
2.客户端
(1)基本概念
客户端是 发起请求 的一方,主动连接服务器并发送请求,然后等待服务器的响应。
典型场景:浏览器、移动应用、桌面程序等。
(2)代码实现
public class UdpEchoClient {private DatagramSocket socket = null;//UDP本身不保存对方信息,在自己的代码中保存一下private String sercerIp;private int serverPort;//和服务器不同,客户端的构造方法不能只有一个端口号,还要有ip地址public UdpEchoClient(String sercerIp, int serverPort) throws SocketException {this.sercerIp = sercerIp;this.serverPort = serverPort;//创建一个socket,不能传入端口号,因为端口号会有竞争,让系统随机分配一个空闲的即可socket = new DatagramSocket();}//启动客户端public void start() throws IOException {Scanner sc = new Scanner(System.in);while (true) {//1.读取用户输入的数据System.out.println("请输入要发送的数据");String request = sc.next();//2.将请求发送给服务器,构建一个DatagramPacket对象,发送给服务器DatagramPacket packet = new DatagramPacket(request.getBytes(), request.getBytes().length, InetAddress.getByName(sercerIp), serverPort);//3.发送数据socket.send(packet);//4.接收服务器的响应数据DatagramPacket responsePacket = new DatagramPacket(new byte[4096], 4096);socket.receive(responsePacket);//5.从数据包中获取响应数据,打印出来String response = new String(responsePacket.getData(), 0, responsePacket.getLength());System.out.println("response:" + response);}}public static void main(String[] args) throws IOException {UdpEchoClient client = new UdpEchoClient("127.0.0.1", 9090);client.start();}
}
(3)逐行解析
1)
private DatagramSocket socket = null;
创建一个socket用来接收和发送数据
2)
private String sercerIp;private int serverPort;
定义String类型的ip地址和int 类型的端口号。
3)
public UdpEchoClient(String sercerIp, int serverPort) throws SocketException {this.sercerIp = sercerIp;this.serverPort = serverPort;//创建一个socket,不能传入端口号,因为端口号会有竞争,让系统随机分配一个空闲的即可socket = new DatagramSocket();}
创建客户端的构造方法。与服务器不同的是,参数不止有端口号,还有ip地址,因为客户端要知道服务器的ip地址和端口号以便发送,而服务器只需要一个端口号来监听、接受客户端发送来的数据。
4)
//1.读取用户输入的数据System.out.println("请输入要发送的数据");String request = sc.next();
读取用户输入的数据。
5)
DatagramPacket packet = new
DatagramPacket(request.getBytes(), request.getBytes().length,
InetAddress.getByName(sercerIp), serverPort);
将请求发送给服务器:构建一个DatagramPacket对象来发送。
1.request.getBytes()
来将字符串request中的字节数组取出来。
2.request.getBytes().length
指定字节数组的长度
3.InetAddress.getByName(sercerIp), serverPort
传入服务器的ip地址和端口号,其中ip地址是字符串,需要用getByname()方法来包装一下。
6)
socket.send(packet);
发送数据给服务器。
7)
DatagramPacket responsePacket = new DatagramPacket(new byte[4096], 4096);
构建一个DatagramPacket对象来作为服务器的响应数据
8)
socket.receive(responsePacket);
responsePacket作为输出型参数,得到了响应数据包里面的内容。
9)
String response = new String(responsePacket.getData(), 0, responsePacket.getLength());System.out.println("response:" + response);
用getData()方法得到的字节数组构建一个字符串作为响应数据,指定了字节数组的长度为【0,字节数组的长度)。
打印日志。
10)
public static void main(String[] args) throws IOException {UdpEchoClient client = new UdpEchoClient("127.0.0.1", 9090);client.start();}
在main方法中指定服务器的ip地址是“127.0.0.1”,这是一个环回ip,表示本机。指定服务器的端口号9090,与服务器的端口号对应。
3.结果展示
服务器:
客户端:
相关文章:
构建一个最简单的UDP服务器和客户端并逐行解析
目录 1.服务器 (1)基本概念 (2)代码实现 3.逐行解析 1) 2) 3) 4) 5) 6) 7) 8) 1. response.getBytes(): 2.response.get…...
LeetCode 1638 统计只差一个字符的子串
标题:LeetCode 算法题 - 统计只差一个字符的子串数目 在算法学习的过程中,我们经常会遇到一些有趣的字符串问题。今天就来探讨一道这样的题目:给定两个字符串 s 和 t ,找出 s 中的非空子串的数目,这些子串满足替换一个…...
DAY 39 leetcode 18--哈希表.四数之和
题号18 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): 和…...
关于lombok的异常快速解决办法
前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…...
Android SELinux权限使用
Android SELinux权限使用 一、SELinux开关 adb在线修改seLinux(也可以改配置文件彻底关闭) $ getenforce; //获取当前seLinux状态,Enforcing(表示已打开),Permissive(表示已关闭) $ setenforce 1; //打开seLinux $ setenforce 0; //关闭seLinux二、命令查看sel…...
JavaWeb注解的原理
WebServlet("/mayikt") 是 Java Servlet 3.0 及以上版本中引入的注解,用于简化 Servlet 的配置。其原理和与 Servlet 映射关系的知识点如下: 1. 注解的作用与原理 核心功能: WebServlet 注解的作用是将当前类声明为一个 Servlet&am…...
类和对象—多态
目录 1、多态的概念2、多态的条件3、向上转型3.1 概念3.2 使用场景 4、向下转型5、多态的优缺点 1、多态的概念 多态,通俗来讲就是多种形态,即对于同样的行为,不同的对象去完成会产生不同的状态。比如动物都会吃东西,小狗和小猫都…...
vscode启动vite+Vue3项目调试功能,QQ浏览器为例
1、增加launch.json配置 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","configurations": [{"type&quo…...
Spring MVC 的执行流程以及运行原理
一.什么是 MVC? MVC 是 Model 、 View 和 Controller 的缩写,分别代表 Web 应用程序中的 3 种职责, MVC 是一种软件设计规范。它将业务逻辑、数据、显示分离的方法来组织代码,降低了视图与业 务逻辑之间的…...
08-Spring MVC 请求处理流程全解析
Spring MVC 请求处理流程全解析(从 DispatcherServlet 到 Controller) Spring MVC 是构建 Web 应用的基础框架,而其中最核心的组件就是 DispatcherServlet,它作为整个请求流程的入口和协调者,掌控了从接收请求、分发到…...
pikachu靶场搭建教程,csfr实操
靶场安装 靶场下载地址 百度网盘下载地址和密码 百度网盘 请输入提取码 0278 github靶场下载地址 https://gitcode.com/Resource-Bundle-Collection/c7cc1 安装前提 这两个文件夹的配置文件都要进行更改修改数据库密码 D:\phpstudy_pro\WWW\pikachu\inc D:\phpstudy_pro…...
MCP + 数据库,一种比 RAG 检索效果更好的新方式!
大家好,欢迎来到 code秘密花园,我是 ConardLi。 在今天这一期,我们将一起学习一种基于 MCP 提高大模型检索外部知识精度的新思路,实测比 RAG 效果要好很多。 目前市面上讲 MCP 的教程比较多,但大多数都是一些概念性的…...
图像处理中的梯度计算、边缘检测与凸包特征分析技术详解
前言 书接上文 OpenCV图像处理实战全解析:镜像、缩放、矫正、水印与降噪技术详解-CSDN博客文章浏览阅读1.1k次,点赞38次,收藏29次。本文系统解析OpenCV图像处理五大实战场景:镜像反转的三种坐标变换模式,图像缩放的尺…...
TDengine 与 taosAdapter 的结合(一)
一、引言 在当今数字化时代,数据量呈爆发式增长,尤其是物联网、工业互联网等领域产生的海量时序数据,对数据存储和处理提出了极高要求。TDengine 作为一款高性能、开源的时序数据库,专为这些场景设计并优化,在时序数据…...
23种设计模式-行为型模式-模板方法
文章目录 简介场景解决代码关键优化点 总结 简介 模板方法是一种行为设计模式,它在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。 场景 假如你正在开发一款分析文档的数据挖掘程序。用户需要向程序输入各种格式&…...
Django异步执行任务django-background-tasks
1、安装 pip install django-background-tasks 2、注册服务 INSTALLED_APPS [...background_task, ]3、生成表 // 生成迁移 python manage.py makemigrations //运行迁移 python manage.py migrate 4、创建文件,模拟任务 from background_task import backgrou…...
从零设计React-Markdown组件的实现方案
从零设计React-Markdown组件的实现方案 现在,把这些步骤整理成代码结构。首先是解析器类,用正则表达式分割文本为Token,然后生成AST。接着,编写一个React组件,接收Markdown字符串,解析成AST,遍历AST生成对应的React元素。处理代码高亮需要引入第三方库,但用户不允许用现…...
如何在React中集成 PDF.js?构建支持打印下载的PDF阅读器详解
本文深入解析基于 React 和 PDF.js 构建 PDF 查看器的实现方案,该组件支持 PDF 渲染、图片打印和下载功能,并包含完整的加载状态与错误处理机制。 完整代码在最后 一个PDF 文件: https://mozilla.github.io/pdf.js/web/compressed.tracemo…...
React-Markdown 组件底层实现原理详解
如何在 React 中渲染 Markdown 文档 React-Markdown 组件底层实现原理详解 一、核心架构:基于 Unified.js 的编译流水线 React-Markdown 的底层实现依赖于 Unified.js 这一开源内容处理系统,其核心是一个可插拔的编译流水线。整个过程分为四个阶段&…...
基于单片机的防火防盗报警系统设计(论文+源码)
2.1系统的功能及方案设计 本次课题为基于单片机的防火防盗报警系统,其系统采用STC89C52单片机为控制器,并结合SIM800短信模块,DS18B20温度检测模块,MQ-2烟雾检测模块,红外人体检测模块,按键模块,…...
NO.72十六届蓝桥杯备战|搜索算法-DFS|选数|飞机降落|八皇后|数独(C++)
P1036 [NOIP 2002 普及组] 选数 - 洛谷 组合型枚举,路径⾥⾯记录选择数的「总和」。在选出k 个数之后,判断「是否是质数」 #include <bits/stdc.h> using namespace std;const int N 25; int n, k; int a[N];int ret; int path; //记录路径中所…...
网络Socket编程基于UDP协议模拟简易网络通信
一、预备知识 网络编程(Network Programming)是指编写程序来实现计算机网络之间的通信。这通常涉及到使用套接字(sockets)来建立连接、发送和接收数据。 (一)套接字 套接字(Socket࿰…...
rust 使用select退出线程
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] pub struct Capture {clear: bool, // ????????interface: String, // ??times: u64, // ?? }pub async fn cmd_capture(State(web_env): State<ArcWebEnv>,Json(args): Json<C…...
C++学习day7
思维导图: 使用vector实现一个简单的本地注册登录系统 注册:将账号密码存入vector里面,注意防重复判断 登录:判断登录的账号密码是否正确 #include <iostream> #include <cstring> #include <cstdlib> #includ…...
【学习笔记】CoACD: 基于碰撞感知凹性与树搜索的近似凸分解
CoACD 基于碰撞感知凹性与树搜索的近似凸分解 CoACD 官方文档 CoACD(Convex Approximation of Complex Decompositions)是一种用于将复杂网格分解为多个凸包的算法, 专为 3D 网格设计了近似凸分解算法,强调在保持物体间潜在碰撞条件的同时减…...
Three.js 系列专题 6:后处理与特效
内容概述 后处理(Post-Processing)是在渲染完成后对画面进行额外的处理,以实现模糊、辉光、颜色校正等效果。Three.js 通过 EffectComposer 提供后处理支持。本专题还将简要介绍着色器和粒子系统,为更复杂的特效打基础。 学习目标 掌握 EffectComposer 的基本使用。实现辉…...
2025 年江苏保安员职业资格考试经验分享
江苏保安行业发展成熟,2025 年考试注重对考生综合素养的考查。报考条件常规,但对诚信记录有额外关注,如有不良信用记录可能影响报考资格。 报名在江苏省各地级市公安局指定点进行,提交资料包括身份证、学历证、个人诚信报告&am…...
亚马逊算法重构消费市场:解码2024年Q1北美站热搜商品的底层逻辑
在跨境电商迈入精细化运营时代的背景下,亚马逊平台最新发布的《2024年Q1零售搜索趋势报告》揭示了算法驱动下的消费新图景。数据显示,北美站点月均超300万人次重复搜索特定品类商品,健康生活、智能家居等五大领域形成持续增长极。这份由亚马逊…...
powershell绑定按钮事件的两种方式
写一个powershell的简单GUI做本地任务,试验出2个方法: 方法1: function btn1_click {write-host $text1.Text -ForegroundColor Green -BackgroundColor Black }$btn1.Add_Click({btn1_click})方法2: $btn2_click {write-host $…...
LearnOpenGL——OIT
教程地址:简介 - LearnOpenGL CN 简介 原文链接:LearnOpenGL - Introduction 前言 在混合(Blending)章节中,我们介绍了颜色混合的主题。混合是在3D场景中实现透明表面的方法。简而言之,透明度涉及到在计算…...
【蓝桥杯】Python大学A组第十五届省赛
1.填空题 1.1.拼正方形 问题描述 小蓝正在玩拼图游戏,他有个的方块和个的方块,他需要从中挑出一些来拼出一个正方形。 比如用个和个的方块可以拼出一个的正方形;用个的方块可以拼出一个的正方形。 请问小蓝能拼成的最大的正方形的边长为多少。 import math # 2*2的个数 a =…...
使用JS+HTML+CSS编写提词器实例
手搓提词器网页版,有些BUG但是基本功能使用没有问题,有需要的可复制粘贴,BUG自行修复。下面直接进入代码: <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><me…...
人工智能基础知识详解:从概念到前沿技术与应用
在数字化浪潮席卷全球的今天,人工智能(Artificial Intelligence,简称AI)已不再是科技前沿的神秘概念,而是融入我们日常工作的实用工具。从智能语音助手到自动驾驶汽车,从医疗影像诊断到生成式艺术创作&…...
重温经典,畅享怀旧游戏盛宴
FC街机是一款专为安卓设备设计的经典游戏合集应用,它将玩家熟悉的红白机(FC)游戏体验带到了移动设备上。这款应用不仅提供了丰富的游戏选择,还通过优化的界面和操作,让玩家能够随时随地享受经典游戏的乐趣。 游戏非常…...
CPU 压力测试命令大全
CPU 压力测试命令大全 以下是 Linux/Unix 系统下常用的 CPU 压力测试命令和工具,可用于测试 CPU 性能、稳定性和散热能力。 1. 基本压力测试命令 1.1 使用 yes 命令 yes > /dev/null & # 启动一个无限循环进程 yes > /dev/null & # 启动第二个进…...
Windows 系统下用 VMware 安装 CentOS 7 虚拟机超详细教程(包含VMware和镜像安装包)
前言 资源 一、准备工作 (一)下载 VMware Workstation (二)下载 CentOS 7 镜像 二、安装 VMware Workstation(比较简单,按下面走即可) 三、创建 CentOS 7 虚拟机 四、安装 CentOS 7 系统…...
QLineEdit的提交前验证
QLineEdit是pyqt中常用的输入控件,默认情况下,它可以接受键盘输入的任何可打印字符。有时候,我们需要在用户提交前对其输入的内容先行验证,当用户输入不符合预期时予以清空,这就需要对QLineEdit控件进行以下操作&#…...
【Linux高级IO(二)】初识epoll
目录 1、epoll的接口 2、epoll原理 3、epoll工作方式 1、epoll的接口 #include <sys/epoll.h> 1、int epoll_create(int size) :创建epoll模型 返回值是一个文件描述符,创建一个struct file结构体,指向epoll模型,返回的…...
2018年真题
数学基础 一、 (共4分)用逻辑符号表达下列语句(论域为包含一切事物的集合) 1、(2分)集合A的任一元素的元素都是A的元素 经过对图片文字的识别与逻辑分析,结果如下: 符号定义&…...
Linux xxd命令
目录 一. xxd命令简介二. 简单使用三. -p选项纯16进制输出四. -r选项将十六进制还原成原始内容五. 小应用 一. xxd命令简介 xxd 是一个将文件或输入内容转换为十六进制(Hex Dump)格式的工具,也可以将十六进制恢复成原始数据。 它在调试二进制…...
高校实验室安全数智化分级分类管理-危化品管理LIMS
一、背景与依据 传统实验室安全管理如同老式挂钟,齿轮咬合处总会随时间产生间隙。为进一步规范学校实验室建设与适用,从源头管控实验室和实验项目安全风险,确保教学科研活动安全有序开展,分级分类体系构建如同绘制实验室的"…...
春芽儿智能跳绳:以创新技术引领运动健康新潮流
在全球运动健康产业蓬勃发展的浪潮中,智能健身器材正成为连接科技与生活的重要纽带。据《中国体育用品产业发展报告》显示,2023年中国智能运动装备市场规模突破千亿元,其中跳绳类目因兼具大众普及性与技术升级空间,年均增速超30%。…...
Fast网络速度测试工具
目录 网站简介 功能特点 测试过程 为什么使用Fast 如果网络速度不达标 网站简介 Fast是一个由Netflix提供的网络速度测试工具,主要用来测试用户的互联网下载速度。它以其简洁的界面和快速的测试过程而受到用户的欢迎。 功能特点 下载速度测试:这是…...
java的文件输入输出流(FileInputStream、FileOutputStream、FileReader、FileWriter)
文章目录 文件输入输出流1 java I/O 流的原理流的分类 2 FileInputStream 文件字节输入流3 FileOutputStream 文件字节输出流4 使用文件字节输入输出流完成对文件的拷贝5 FileReader 文件字符输入流6 FileWriter 文件字符输出流 文件输入输出流 1 java I/O 流的原理 I/O 是 In…...
stm32week10
stm32学习 七.CAN 7.STM32 CAN外设 标识符过滤器: 每个过滤器的核心由两个32位寄存器组成:R1[31:0]和R2[31:0] FSCx:位宽设置,置0为16位,置1为32位 FBMx:模式设置,置0为屏蔽模式,…...
【UnityEditor扩展】如何在 Unity 中创建棱柱体(用作VR安全区检测),同时在编辑器插件中实现与撤销/恢复功能
Unity 编辑器扩展:3D 空间中绘制安全区棱柱体(含撤销/恢复/保存/读取) 在虚拟现实(VR)和增强现实(AR)开发中,安全区是保障用户安全的重要组成部分。通过精确控制用户活动范围&#…...
C++小游戏 合集
生化危机 #include<conio.h> #include<string.h> #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<time.h> #include<direct.h> int n,round,gold0; bool f1,f2,f3,deadfalse,PC_64Bit; char str[4]; struct n…...
常州 d??
回来了! 今天(?发出来的时候可能已经是第二天了吧 真的爆零了qaq 挺难的 最高分只有100 而且t2t3t4一个人都没拿分qaq 这段时间在写网络流 唉博客还是不要写太水了 抄一点网络流代码上来 EK不写了 dinic会就行了 板子题洛谷p3376 dini…...
juc并发包的常用类、线程安全实现方式、锁机制及 JVM 优化策略
juc并发包的常用类、线程安全实现方式、锁机制及 JVM 优化策略 1. juc包下的常用类:线程池:并发集合类:同步工具类:原子类: 2. 怎么保证多线程安全:3. Java中常用锁及使用场景:4. 线程同步的方法…...
学习日记-0407(Inductive Matrix Completion Using Graph Autoencoder)
论文阅读:Inductive Matrix Completion Using Graph Autoencoder 代码:swtheing/IMC-GAE 总而言之就是设计了一个不同评分下的邻接图,然后对每一个评分图T进行独立GNN编码。这个 GNN 编码器主要由三个组件构成:嵌入层、消息传递层…...