Java中网络编程的学习
目录
网络编程概述
网络模型
网络通信三要素: IP 端口号 通信协议
IP地址(Internet Protocol Address)
端口号
网络通信协议
TCP
三次握手
四次挥手
UDP
TCP编程
客户端Socket的工作过程包含以下四个基本的步骤:
服务器程序的工作过程包含以下四个基本的步骤:
UDP编程
发送端
接收端,要指定监听的端口
网络编程概述
计算机网络:
把分布在不同地理区域的具有独立功能的计算机,通过通信设备与线路连接起来,由功能完善的
软件实现资源共享和信息传递的系统。
Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开
发常见的网络应用程序。
Java提供的网络类库,可以实现网络连接,联网的底层细节被隐藏在Java 的本机安装系统里,
由 JVM 进行控制。并且 Java 实现了一个 跨平台的网络库,程序员面对的是一个统一的网络编程
环境。
网络编程的目的:
直接或间接地通过网络与其它计算机进行通讯。
网络编程中有两个主要的问题:
1.如何准确地定位网络上一台或多台主机
2.找到主机后如何可靠高效地进行数据传输。
网络模型
网络通信三要素: IP 端口号 通信协议
IP地址(Internet Protocol Address)
IP是指互联网协议地址,又译为网际协议地址.网络中的计算机使用IP地址来进行唯一标识。
在Windows系统下,打开cmd,输入命令ipconfig,按回车即可查看。
本地回环地址(hostAddress):127.0.0.1 ,它代表设备的本地虚拟接口。
端口号
端口号是计算机中的应用程序的一个整数数字标号,用来区分不同的应用程序。
0 ~ 1024 未被系统使用或保留的端口号,0 ~ 65535为有效的端口号,也就是说我们要对一些程
序定义端口号的时候,要选择1024 ~ 65535范围内的整数数字。
网络通信协议
计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代码结构、 传输控制步骤、出错控制等制定标准。
传输层协议中有两个非常重要的协议:
传输控制协议TCP(Transmission Control Protocol)
用户数据报协议UDP(User Datagram Protocol)。
TCP
使用TCP协议前,须先建立TCP连接,形成传输数据通道
传输前,采用“三次握手”方式,是可靠的
TCP协议进行通信的两个应用进程:客户端、服务端
在连接中可进行大数据量的传输
传输完毕,需释放已建立的连接,效率低
在断开时要进行“四次挥手”
三次握手
而用更通俗的语言来说则是这样:
四次挥手
而用更通俗的语言来说则是这样:
UDP
将数据、源、目的封装成数据包,不需要建立连接
每个数据报的大小限制在64K内
因无需连接,故是不可靠的
发送数据结束时无需释放资源,速度快
TCP编程
利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实上的标准。
通信的两端都要有Socket,是两台机器间通信的端点
网络通信其实就是Socket间的通信。
Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
客户端Socket的工作过程包含以下四个基本的步骤:
1.创建 Socket:
根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
2.打开连接到 Socket 的输入/出流:
使用 getInputStream()方法获得输入流
使用 getOutputStream()方法获得输出流,进行数据传输
3.按照一定的协议对 Socket 进行读/写操作:
通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
4.关闭 Socket:
断开客户端到服务器的连接,释放线路
/*
客户端*/
public class Client {public static void main(String[] args) {//创建客户端try {Socket socket=new Socket("127.0.0.1",6666);//连接自己ip为127.0.0.1String s ="你好服务器";OutputStream output=socket.getOutputStream();output.write(s.getBytes());} catch (IOException e) {throw new RuntimeException(e);}}
}
使用包装流输入输出:
public class Client {public static void main(String[] args) {try {Socket socket = new Socket("127.0.0.1",6666);String s = "你好服务器";DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());dataOutputStream.writeUTF(s);DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());String s1 = dataInputStream.readUTF();System.out.println(s1);} catch (IOException e) {e.printStackTrace();}}
}
服务器程序的工作过程包含以下四个基本的步骤:
1.调用 ServerSocket(int port) :
创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
2.调用 accept():
监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。
3.调用 该Socket类对象的 getOutputStream() 和 getInputStream ():
获取输出流和输入流,开始网络数据的发送和接收。
4.关闭ServerSocket和Socket对象:
客户端访问结束,关闭通信套接字。
服务器建立 ServerSocket 对象
ServerSocket 对象负责等待客户端请求建立套接字连接,类似邮局某个窗口中的业务员。也就是说,服务器必须事先建立一个等待客户请求建立套接字连接的ServerSocket对象。
/*
服务器*/
public class Server {public static void main(String[] args) {try {//创建服务器对象ServerSocket serverSocket=new ServerSocket(6666);System.out.println("服务器启动成功");//监听客户端是否向服务器发送链接请求Socket socket= serverSocket.accept();System.out.println("有客户端连接到了服务器");//后续操作InputStream input=socket.getInputStream();byte[]bytes=new byte[100];int size=input.read(bytes);String s=new String(bytes,0,size);System.out.println(s);}catch (IOException e){e.printStackTrace();System.out.println("服务器启动失败,端口已被占用");}}
}
使用包装流输入输出:
public class Server {public static void main(String[] args) {try {System.out.println("服务器开始启动");ServerSocket serverSocket = new ServerSocket(6666);System.out.println("服务器启动成功");Socket socket = serverSocket.accept();//包装流 直接读到一个字符串DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());String s = dataInputStream.readUTF();System.out.println(s);//从服务器端向客户端发送一个消息String s1 = "你好客户端!";DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());dataOutputStream.writeUTF(s1);} catch (IOException e) {e.printStackTrace();}}
}
UDP编程
类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。
UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接
流程:
1. DatagramSocket与DatagramPacket
2. 建立发送端,接收端
3. 建立数据报
4. 调用Socket的发送、接收方法
5. 关闭Socket
注意:发送端与接收端是两个独立的运行程序
发送端
/*
发送端*/
public class Send {public static void main(String[] args) throws IOException {//用来发送和接受数据DatagramSocket datagramSocket=new DatagramSocket();
/*public DatagramPacket(byte buf[], int offset, int length,InetAddress address, int port) { 参数分别为字节数组,从哪里开始发送 ,发送多长 ,用一个类来分装IP地址,端口setData(buf, offset, length);setAddress(address);setPort(port);}*/byte []bytes="你好".getBytes();//数据报DatagramPacket datagramPacket=new DatagramPacket(bytes,0,bytes.length, InetAddress.getByName("127.0.0.1"),6666);//发送datagramSocket.send(datagramPacket);System.out.println("发送完成");}
}
接收端,要指定监听的端口
/*
接收端*/
public class Receive {public static void main(String[] args) throws IOException {//用来发送和接受数据DatagramSocket datagramSocket=new DatagramSocket(6666);//创建一个接受的数据报byte[]bytes=new byte[100];DatagramPacket datagramPacket=new DatagramPacket(bytes,0,bytes.length);//接受datagramSocket.receive(datagramPacket);String s=new String(bytes,0,datagramPacket.getLength());//datagramPacket.getLength()接受到数据的实际长度}
}
相关文章:
Java中网络编程的学习
目录 网络编程概述 网络模型 网络通信三要素: IP 端口号 通信协议 IP地址(Internet Protocol Address) 端口号 网络通信协议 TCP 三次握手 四次挥手 UDP TCP编程 客户端Socket的工作过程包含以下四个基本的步骤: 服务器程序…...
微服务的CAP定理与数据一致性抉择
分布式系统中的CAP定理,包括一致性(Consistency)、可用性(Availability)和分区容错性(Partition Tolerance)三个核心要素。 微服务是分布式系统的一种表现形式,以及用户对于系统是分…...
正则表达式 - 简介
正则表达式 - 简介 正则表达式(Regular Expression,简称Regex)是一种用于处理字符串的强大工具,它允许我们按照特定的模式(pattern)来搜索、匹配、查找和替换文本。正则表达式广泛应用于各种编程语言和工具…...
MySQL:表的内外连接
目录 1.内连接 2.左外连接和右外连接 178. 分数排名 - 力扣(LeetCode) 1.内连接 内连接就是两张表做笛卡尔积,再加上一个筛选条件。 这两个sql语句是一样的。 2.左外连接和右外连接 左外连接就是左表必须是完全显示,即使筛选…...
65.在 Vue 3 中使用 OpenLayers 绘制带有箭头的线条
前言 在现代的前端开发中,地图已经成为许多项目的核心功能之一。OpenLayers 是一个强大的开源地图库,它提供了丰富的功能和高度的定制化支持。在本篇文章中,我将向大家展示如何在 Vue 3 中使用 OpenLayers 绘制带有箭头的线条。 我们将实现…...
关于编写测试用例的细枝末节
这里写目录标题 故障判别类-边界考虑示例1.0:若A>20.3且持续时间≥15ms时(判故周期为1000Hz),输出B为1,否则输出B为0。 故障判别类-不可恢复测试示例1.1:若A>20.3且持续时间≥15ms时…...
【Vim Masterclass 笔记13】第 7 章:Vim 核心操作之——文本对象与宏操作 + S07L28:Vim 文本对象
文章目录 Section 7:Text Objects and MacrosS07L28 Text Objects1 文本对象的含义2 操作文本对象的基本语法3 操作光标所在的整个单词4 删除光标所在的整个句子5 操作光标所在的整个段落6 删除光标所在的中括号内的文本7 删除光标所在的小括号内的文本8 操作尖括号…...
(一)QSQLite3库简介
1、SQLite数据库 SQLite数据库,作为一个轻量级的关系型数据库管理系统,广泛应用于移动设备和桌面应用程序中。由于其简单易用、无需配置的特点,它为开发者提供了极大的便利。然而,正是由于其应用广泛,随着用户对于系统…...
新版 MacOS 无法从 /usr/local/lib 加载动态链接库的解决办法
自己编写的动态链接库在Unix规范下一般位于/usr/local/lib,在2023年及之前的MacOS版本中,直接将动态库安装到该位置即可在程序运行时加载,可是升级MacOS版本后,ld就报错。 错误现象 运行程序,报错 dyld[6376]: Libra…...
PanWeidb-使用BenchmarkSQL对磐维数据库进行压测
本文提供PanweiDb使用BenchmarkSQL进行性能测试的方法和测试数据报告。 BenchmarkSQL,一个JDBC基准测试工具,内嵌了TPC-C测试脚本,支持很多数据库,如PostgreSQL、Oracle和Mysql等。 TPC-C是专门针对联机交易处理系统(OLTP系统)的规范,一般情况下我们也把这类系统称为业…...
git在本地创建新分支并将该分支推送到远程仓库
1. 创建本地分支 首先,创建并切换到一个新的本地分支: git checkout -b new-branch-name2. 推送本地分支到远程仓库 将新的本地分支推送到远程仓库,并在远程创建一个对应的新分支: git push origin new-branch-name3. 设置本地…...
Axure9笔记
快速入门 原型图种类 1.线框图 2.高保真图 3.简易需求文档(PRD) tips 按住shift可以等比缩放 旋转:ctrl按角角 矢量图素材: iconfont-阿里巴巴矢量图标库 复制svg图-->将svg图换为形状 截屏: Windows&…...
33_操作Redis分片集群
1.Redis分片集群读写 我们使用的redis-cli --cluster提供了很多操作集群的命令,可以通过下面方式查看。 [root@localhost ~]# redis-cli --cluster help 1.连接上7001节点后,尝试存储一组num=100和a=10的数据,语句如下所示。 [root@node1 cluster]# redis-cli -a 123456…...
llama.cpp 模型可视化工具 GGUF Visualizer
llama.cpp 模型可视化工具 GGUF Visualizer 1. GGUF Visualizer for VS Code (gguf-viz)1.1. Features1.2. Extension Settings References GGUF Visualizer https://marketplace.visualstudio.com/items?itemNameAgainstEntropy.gguf-viz 1. GGUF Visualizer for VS Code (g…...
MAC AndroidStudio模拟器无网络
先确认PC端是正常访问网络的; 模拟器端修改Wifi设置:设置 - 网络和互联网 - WALN设置 按照上图修改; IP设置:从DHCP修改为静态,IP地址:10.0.2.16 ,网关:10.0.2.2 , DNS…...
如何添加合适的索引:MySql 数据库索引认知
写在前面 博文内容涉及 Mysql 数据库索引简单认知,包括SQL执行过程,数据库数据存储原理。如何通过索引加快数据查询原理简单介绍适合有一定SQL基础的开发运维小伙伴建立数据库索引认知,学会如何添加索引理解不足小伙伴帮忙指正 😃…...
深度学习中的学习率调度器(scheduler)分析并作图查看各方法差异
文章目录 1. 指数衰减调度器(Exponential Decay Scheduler)工作原理适用场景实现示例 2. 余弦退火调度器(Cosine Annealing Scheduler)工作原理适用场景实现示例 3. 步长衰减调度器(Step Decay Scheduler)工…...
测试人员面试需要掌握的内容
测试人员面试需要掌握的内容 1、在公司的测试流程是什么? 产品经理确认本次版本的需求,召开需求评审会,进行估时排期,需求和时间都确定之后,UI出设计图,开发人员进行开发,测试人员编写测试用例…...
【C++】函数(下)
1、函数的常见样式 常见的函数样式有四种: (1)无参数无返回值 (2)有参数无返回值 (3)无参数有返回值 (4)有参数有返回值 (1)无参数无返回值 示例…...
dockerfile实现lnmp
dockerfile实现lnmp 自定义镜像实现整个架构 (基础镜像centos7) nginx cd /opt mkdir nginx mysql php vim Dockerfile docker network create --subnet172.111.0.0/16 mynetwork #创建自定义网段 docker run -itd --name nginx -p 80:80 --cpu-quota 20000 -m 512m -v /op…...
C语言进阶-2指针(一)
目录 1. 字符指针1.1 一般用法:字符指针指向单字符1.2 第二种用法,字符串首地址给指针变量1.3 习题,下面代码的输出结果是什么?为什么? 2. 指针数组2.1实例—— 字符指针数组2.2实例——整形指针数组2.3 例子,识别下下…...
JAVA:Spring Boot 集成 JWT 实现身份验证的技术指南
1、简述 在现代Web开发中,安全性尤为重要。为了确保用户的身份,JSON Web Token(JWT)作为一种轻量级且无状态的身份验证方案,广泛应用于微服务和分布式系统中。本篇博客将讲解如何在Spring Boot 中集成JWT实现身份验证…...
SpringBoot链接Kafka
一、SpringBoot生产者 (1)修改SpringBoot核心配置文件application.propeties, 添加生产者相关信息 # 连接 Kafka 集群 spring.kafka.bootstrap-servers192.168.134.47:9093# SASL_PLAINTEXT 和 SCRAM-SHA-512 认证配置 spring.kafka.properties.securi…...
《深度剖析算法优化:提升效率与精度的秘诀》
想象一下,你面前有一堆杂乱无章的数据,你需要从中找到特定的信息,或者按照一定的规则对这些数据进行排序。又或者,你要为一个物流公司规划最佳的配送路线,以降低成本和提高效率。这些问题看似复杂,但都可以…...
APP推荐:全新TV端来了,8K原画电视版
▌ 软件介绍 B站都不陌生吧,一个能追番、学习、娱乐的多元平台,之前也分享过几款第三方TV端,其中的BV最近更新了全新版本。 使用了全新的UI界面,由之前的顶部菜单栏改成了侧边布局,已解锁限制&…...
Spark vs Flink分布式数据处理框架的全面对比与应用场景解析
1. 引言 1.1 什么是分布式数据处理框架 随着数据量的快速增长,传统的单机处理方式已经无法满足现代数据处理需求。分布式数据处理框架应运而生,它通过将数据分片分布到多台服务器上并行处理,提高了任务的处理速度和效率。 分布式数据处理框…...
【Linux】正则表达式
正则表达式是一种可供Linux工具过滤文本的自定义模板,Linux工具(如sed、gawk)会在读取数据时使用正则表达式对数据进行模式匹配。 正则表达式使用元字符来描述数据流中的一个或多个字符。它是由正则表达式引擎实现的。正则表达式引擎是一种底…...
《银行保险机构数据安全管理办法》正式实施,分类分级、安全评估共筑安全防线
金融数据具有高价值和高敏感性,金融数据安全关乎国家安全和金融消费者权益密切相关。在当前数字化进程加速的背景下,数据合作频繁,安全风险也随之增加,给机构管理带来了新挑战。 为规范银行业保险业数据处理活动,保障数…...
excel仅复制可见单元格,仅复制筛选后内容
背景 我们经常需要将内容分给不同的人,做完后需要合并 遇到情况如下 那是因为直接选择了整列,当然不可以了。 下面提供几种方法,应该都可以 直接选中要复制区域然后复制,不要选中最上面的列alt;选中可见单元格正常复制ÿ…...
26_Redis RDB持久化
从这个模块开始带领大家来学习Redis分布式缓存的相关内容,主要学习目标见下: 数据丢失问题:实现Redis数据持久化(RDB和AOF)并发能力问题:搭建Redis主从集群,实现读写分离故障恢复问题:利用Redis哨兵模式,实现健康检测和自动恢复存储能力问题:搭建Redis分片集群,利用…...
Windows图形界面(GUI)-QT-C/C++ - QT控件创建管理初始化
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 控件创建 包含对应控件类型头文件 实例化控件类对象 控件设置 设置父控件 设置窗口标题 设置控件大小 设置控件坐标 设置文本颜色和背景颜色 控件排版 垂直布局 QVBoxLayout …...
Java+Maven+GDAL
下载已经编译好的压缩包,下载地址 解压 jar 包 release-1930-x64-dev.zip\release-1930-x64\bin\gdal\java 目录下 打成Maven依赖 mvn install:install-file -Dfilegdal-3.10.1.jar -DgroupIdorg.gdal -DartifactIdgdal -Dversion3.10.1 -Dpackagingjar -Dgener…...
基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用-以ENSO预测为例讲解
1. 背景与目标 ENSO(El Nio-Southern Oscillation)是全球气候系统中最显著的年际变率现象之一,对全球气候、农业、渔业等有着深远的影响。准确预测ENSO事件的发生和发展对于减灾防灾具有重要意义。近年来,深度学习技术在气象领域…...
Java算法 数据结构 栈 队列 优先队列 比较器
目录 栈 Stack 性质 构造 方法 代码示例 队列 Queue 性质 构造 方法 代码示例 优先队列 PriorityQueue 性质 构造 方法 代码示例 比较器 1. Comparator 接口的方法 2. 常见的内置比较器 1. 自然排序比较器(naturalOrder()) 2. 逆序排…...
安装本地测试安装apache-doris
一、安装前规划 我的服务器是三台麒麟服务器,2台跑不起来,这是我本地的,内存分配的也不多。 fe192.168.1.13 主数据库端口9030访问 8Gbe192.168.1.13内存4G 硬盘50be192.168.1.14内存4G 硬盘50be192.168.1.12内存4G 硬盘5013同时安装的fe和be 。 原理:192.168.1.13 服…...
CSS | 实现三列布局(两边边定宽 中间自适应,自适应成比)
目录 示例1 (中间自适应 示例2(中间自适应 示例3(中间自适应 示例4 (自适应成比 示例5(左中定宽,右边自适应 示例6(中间自适应 示例7(中间自适应 示例8(中间定宽…...
Centos8部署Redis Cluster
Redis Cluster 通过分片方式实现高可用,数据分布在多个节点,支持水平扩展。 1、环境准备 一般建议准备六个节点(推荐 3 个主节点 + 3 个从节点) 2、配置Redis Cluster模式 2.1、配置文件 修改 redis.conf: 每个节点的配置应包括以下内容: port <port> …...
如何通过openssl生成.crt和.key
生成 .crt(证书文件)和 .key(私钥文件)的过程通常涉及使用加密工具或库来创建密钥对,并生成证书请求,最终由证书颁发机构(CA)或自签名生成证书。以下是生成 .crt 和 .key 文件的详细…...
Vue.js组件开发-使用地图绘制轨迹
在Vue.js中开发一个组件来展示地图并绘制轨迹,可以使用诸如Leaflet.js、Mapbox GL JS或百度地图等地图库。这些库提供了丰富的API来创建和定制地图,以及绘制路径、标记和其他地图元素。 示例: 1. 安装Leaflet.js 首先,需要安装…...
大数据技术在智能制造中的应用前景
💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…...
iOS 解决两个tableView.嵌套滚动手势冲突
我们有这样一个场景,就是页面上有一个大的tableView, 每一个cell都是和屏幕一样高的,然后cell中还有一个可以 tableView,比如直播间的情形,这个时候如果我们拖动 cell里面的tableView滚动的话,如果滚动到内…...
认识机器学习中的结构风险最小化准则
上一篇文章我们学习了关于经验风险最小化准则,其核心思想是通过最小化训练数据上的损失函数来优化模型参数,从而提高模型在训练集上的表现。但是这也会导致一个问题,经验风险最小化原则很容易导致模型在训练集上错误率很低,但在未…...
Java定时任务
在 Java 中,定时任务通常用于在特定时间或间隔执行某个操作。Java 提供了多种方式来实现定时任务,包括使用 Timer 类、ScheduledExecutorService 和 Spring 框架中的定时任务功能。下面将介绍这些常见的方法。 1. 使用 Timer 类 Timer 类可以用来安排任…...
[Effective C++]条款46 友元非成员函数
本文初发于 “天目中云的小站”,同步转载于此。 条款46 : 需要类型转换时请为模板定义友元非成员函数 本条款是条款24的延申讨论, 在引入模板的前提下, 如果我们想实现某些隐式类型转换的操作, 会需要比以往多一些额外的操作, 让我们通过本条款来理解. 前提引入 还…...
Android Room 持久化库的介绍及使用方法
Android Room 是 Android Jetpack 组件之一,是 Google 官方推出的用于简化 SQLite 数据库操作的持久化库。它提供了一个抽象层,允许开发者在 SQLite 数据库上执行常见的 CRUD 操作,同时处理数据库连接、数据迁移和查询优化等底层细节。 Andr…...
《零基础Go语言算法实战》【题目 2-22】Go 调度器优先调度问题
《零基础Go语言算法实战》 【题目 2-22】Go 调度器优先调度问题 下面代码的输出是什么?请说明原因。 package main import ( "fmt" "runtime" "sync" ) func main() { runtime.GOMAXPROCS(1) wg : sync.WaitGroup{} wg.Add(10)…...
win10电脑 定时关机
win10电脑 定时关机 https://weibo.com/ttarticle/p/show?id2309405110707766296723 二、使用任务计划程序设置定时关机打开任务计划程序: 按下“Win S”组合键,打开搜索框。 在搜索框中输入“任务计划程序”,然后点击搜索结果中的“任务…...
解决 VSCode 调试时 Python 文件出现相对路径报错问题‘FileNotFoundError’
文章目录 1. 问题描述2. 解决方法 1. 问题描述 在使用 VSCode 进行 Python 开发时,遇到一个的问题:在调试模式下,程序无法读取文件或路径,导致File Not Found Error 错误。然而,当不使用调试模式而是直接运行 Python 文…...
四数相加力扣--454
目录 题目 思路 代码 题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1: 输…...
C# 下 SQLite 并发操作与锁库问题的 5 种解决方案
开篇:你是否被 SQLite 并发锁库困扰? 在当今数字化的时代浪潮中,数据已然成为了企业与开发者们手中最为宝贵的资产之一。C# 作为一门广泛应用于各类软件开发的强大编程语言,常常需要与数据库进行紧密交互,以实现数据的…...