当前位置: 首页 > news >正文

Nodejs-- 网络编程

网络编程

构建tcp服务

TCP

tcp全名为传输控制协议。再osi模型中属于传输层协议。
在这里插入图片描述

tcp是面向连接的协议,在传输之前需要形成三次握手形成会话
在这里插入图片描述

只有会话形成了,服务端和客户端才能想发送数据,在创建会话的过程中,服务端和客户端分别提供一个套接字。两个套接字共同形成一个连接, 服务端和客服端通过套接字实现两者的操作

创建TCP服务端

var net = require('net')
var server = net.createServer(function (socket) {// 新的连接socket.on('data',function(data) {socket.write('你好')})socket.on('end', function(data) {console.log('连接断开')})socket.write('welcome to the new world')
})
// 监听方式
server.listen(8124, function() {console.log('server bound')
})
// 新的连接
server.on('connection', function(socket) {
})

TCP服务的事件

服务器事件

对于net.createServer()创建的服务器而言,是一个eventEmitter实例,自定义的事件有如下几种

  1. listening: server.listen()绑定端口。
  2. connection: 每个客户端套接字连接到服务器端的时候触发。
  3. close: 当服务器关系触发的时候,在调用server.close()
  4. error: 当服务器发生异常的时候, 会触发该事件。
连接事件

服务端可以同多个客户端保持连接。对于每个连接而言都是典型的可读可写的stream对象。stream对象可以用于服务端和客户端之间的通信,既可以是通过data事件从一段到另一端发来的数据,也可以通过write方法从一段向另一端发送数据。

  1. data: 当一端通过write发送数据,另一端会触发data事件
  2. end: 当连接中的任意一端发送了FIN数据,当套接字和服务端成功会被触发
  3. connect: 该事件用于客户端,当套接字和服务端连接成功的时候会触发
  4. error: 当异常发生的时候,触发该事件
  5. close: 当套接字完全关闭的时候,触发该事件
  6. timeout: 当一定时间后连接不在活跃的时候,该事件会被触发。通知用户已经被闲置了
  7. drain: 当任意一段调用write发送数据时, 当前这端会触发该事件
    tcp套接字是可写可读的stream对象,可以利用pipe方法巧妙的实现管道操作
var net = require('net')
var server = net.createServer(function(socket){socket.write('Echo server')socket.pipe(socket)
})
server.listen(1337, '127.0.0.1')

TCP针对网络中的小数据包有一定的优化策略:Nagle算法。如果每次只发送一个字节的内容而不优化,网络中将充满只有极少数有效数据的数据包,将十分浪费网络资源。Nagle算法针对这种情况,要求缓冲区的数据达到一定数量或者一定时间后才将其发出,所以小数据包将会被Nagle算法合并,以此来优化网络。

构建UDP服务

UDP不是面向连接的。一个套接字可以与多个UDP服务通信,它虽然提供面向事务的简单不可靠信息传输服务,在网络差的情况下存在丢包严重的问题

创建UDP套接字

UDP套接字一旦创建,既可以作为客户端发送数据,也可以作为服务器端接收数据。

var dgram = require('dgram')
var socket = dgram.createSocket("udp4")

创建udp服务器端

var dgram = require('dgram')
var server = dgram.createSocket("udp4")
server.on("message", function(msg, rinfo){console.log("server got: " + msg + " from " +rinfo.address + ":" + rinfo.port);
})    
server.on('listening', function() {var address = server.address()console.log('server listening' + address.address + ":" + address.port)
})
server.bind(41234)

创建UDP客户端

var dgram = require('dgram')
var message = new Buffer('深入nodejs')
var client = dgram.createSocket("udp4")
client.send(message, 0, message.length, 41234, "localhost", function(err, bytes) {client.close()
})

api: socket.send(buf, offset, length, port, address, [callback])

upd套接字事件

  1. message: 收到信息的时候触发该事件,携带数据为消息buffer和一个远程地址信息
  2. listening: upd套接字来来时监听该事件
  3. close: 调用close可以触发该事件。不在触发message事件。
  4. error: 发生异常的时候触发该事件,不监听,异常之间抛出。

HTTP

curl -v http://127.0.0.1:1337 // tcp三次握手GET / HTTP/1.1  // 客服端发送请求报文
User-Agent: curl/7.24.0(x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
Host: 127.0.0.1:1337
Accept: */* HTTP/1.1 200 OK // 服务端发送响应内容
Content-Type: text/plain
Date: Sat, 06 Apr 2013 08:01:44 GMT
Connection: keep-alive
Transfer-Encoding: chunkedhello world

基于请求响应式的,以一问一答的方式实现服务,虽然基于TCP会话,但是本身却并无会话的特点。
浏览器构造HTTP报文发向图片服务器端;然后,服务器端判断报文中的要请求的地址,将磁盘中的图片文件以报文的形式发送给浏览器;浏览器接收完图片后,调用渲染引警将其显示给用户。

http模块

Node的http模块包含对HTTP处理的封装。在Node中,HTTP服务继承自TCP服务器(net块 ),它能够与多个客户端保持连接,由于其采用事件驱动的形式,并不为每一个连接创建额外的线程或进程,保持很低的内存占用,所以能实现高并发
在开启keepalive后,一个TCP会话可以用于多次请求和响应。TCP服务以connection为单位进行服务,HTTP服务以request为单位进行服务。http模块即是将connection到request的过程进行了封装
在这里插入图片描述

http模块讲连接所用的套接字的读取抽象为ServerRequest和ServerResponse对象。分别对应请求和响应操作。在请求产生的过程中,http模块拿到连接中传来的数据,调用二进制模块http_parser进行解析,在解析完请求报文的报头之后,触发request时间,调用用户的业务逻辑。
在这里插入图片描述

function(req, res) {res.writeHead(200, {'Content-Type': 'text/plain'})res.end('hello wrold\n')
}

HTTP请求

对于TCP连接的读操作,http模块将其封装为ServerRequest对象。让我们再次查看前面的请求报文,报文头部将会通过http_parser进行解析。请求报文的代码如下所示:

GET /HTTP 1.1
User-Agent: curl/7.24.0(x86 64-apple-darwin12.0)libcurl/7.24.0 0penssL/0.9.8r zlib/1.2.5
Host: 127.0.0.1:1337
Accept: */*

报文体部分抽象一个只读流对象,如果业务逻辑需要读取报文体中的数据,数据流结束后才能进行操作

function (req, res) {var buffers = []req.on('data', function(trunk) {buffers.push(trunk);}).on('end', function() {var buffer = Buffer.concat(buffers)res.end('Hello world')    })
}

HTTP请求对象和HTTP响应对象是相对较底层的封装,现行的Web框架如Connect和Express都是在这两个对象的基础上进行高层封装完成的。

HTTP 响应

再来看看HTTP响应对象。HTTP响应相对简单一些,它封装了对底层连接的写操作,可以将其看成一个可写的流对象。它影响响应报文头部信息的API为res.setHeader()和res.writeHead()。

res.writeHead(200, {'Content-Type': 'text/plain'})
HTTP/1.1 200 OK
Content-Type: text/plain

只有调用writeHead后,报文才会写入到连接中,除此之外,http模块会自动帮你设置一些头信息

Date: Sat, 06 Apr 2013 08:01:44 GMT
Connection:keep-alive
Transfer-Encoding:chunked

报文体部分则是调用res.write()和res.end()方法实现,后者与前者的差别在于res.end()会先调用write()发送数据,然后发送信号告知服务器这次响应结束
响应结束后,HTTP服务器可能会将当前的连接用于下一个请求,或者关闭连接。值得注意的是,报头是在报文体发送前发送的,一旦开始了数据的发送,writeHead()和setHeader()将不再生效。
无论服务器端在处理业务逻辑时是否发生异常,务必在结束时调用res.end()结束请求,否则客户端将一直处于等待的状态。当然,也可以通过延迟res.end()的方式实现客户端与服务器端之间的长连接,但结束时务必关闭连接。

HTTP服务的事件

HTTP服务也抽象了一些事件,提供给应用层使用。同样典型的是,服务器是一个EventEmitter实例

  1. connect事件:在开始HTTP请求和响应前,客户端与服务器端需要建立底层的TCP连接,这个连接可能因为开启了keep-alive,可以在多次请求响应之间使用;当这个连接建立时,服务器触发一次connection事件。
  2. request事件: 建立TCP连接后,http模块底层将在数据流中抽象出HTTP请求和HTTP响应,当请求数据发送到服务器端,在解析出HTTP请求头后,将会触发该事件;在res.end()后,TCP连接可能将用于下一次请求响应。
  3. close事件: 与TCP服务器的行为一致,调用server.close()方法停止接受新的连接,当已有的连接都断开时,触发该事件;可以给server.close()传递一个回调函数来快速注册该事件。
  4. checkContinue: 某些客户端在发送较大的数据时,并不会将数据直接发送,而是先发送一个头部带Expect:100-continue的请求到服务器,服务器将会触发checkContinue事件;如果没有为服务器监听这个事件,服务器将会自动响应客户端100Continue的状态码,表示接受数据上传;如果不接受数据的较多时,响应客户端400Bad Request拒绝客户端继续发送数据即可
  5. connect事件:当客户端发起CONNECT请求时触发,而发起CONNECT请求通常在HTTP代理时出现;如果不监听该事件,发起该请求的连接将会关闭。
  6. upgrade事件:当客户端要求升级连接的协议时,需要和服务器端协商,客户端会在请求头中带上Upgrade字段,服务器端会在接收到这样的请求时触发该事件。
  7. clientError事件:连接的客户端触发error事件时,这个错误会传递到服务器端,此时触发该事件。

http客户端

node提供了基础的http和https模块用于http和https的封装

HTTP模块

在node中,http服务器继承自tcp服务器(net模块),能够和多个客户端保持连接,采用事件驱动的方式。不会为每一个连接创建额外的线程或者进程。在开启keepalive之后,一个tcp会话可以用于多个请求和响应,tcp服务以connection为单位进行服务,http服务以request为单位进行服务。
在这里插入图片描述

http模块将连接所用到的套接字的读写过程抽象为serverrequest和serverresopnse对象,分别对应请求和响应操作,在请求产生的过程中,http模块拿到连接传来的数据,调用二进制http_parser进行解析。解析完报文之后,触发request事件。
在这里插入图片描述

HTTP请求

对于TCP连接的读操作http模块将其封装为ServerRequest对象。分解为这些属性: 1. req.method 2. req.url 3. req.httpVersion

HTTP响应

res.setHeader, 可以进行多次设置,只有调用res.writedHead之后,才会写入连接中
res.writeHeader

HTTP服务的事件

服务器是一个EventEmitter实例

  1. connection事件: 在开始HTTP请求和响应之前,客户端和服务器需要建立底层的tcp连接。这个连接开启了keep-alive事件,可以在多个响应中使用,这个连接建立的时候,服务器触发一个connection事件
  2. request事件: 建立tcp连接之后,http模块底层将在数据流中抽象出http请求和http响应,当请求数据发送到服务器端,在解析出http请求报文之后,会触发该事件,在res.end()事件之后,tcp可能会用于下一次响应。
  3. checkContinue事件: 某些客户端在发送较大的数据之后,不会讲数据直接发送,发送continue(100)。服务器会触发checkCoutinue的事件,如果没有为服务器监听这个事件,服务器将会自动响应客户端100Continue的状态码,表示接受数据上传;如果不接受数据的较多时,响应客户端400Bad Request拒绝客户端继续发送数据即可。
  4. connect事件: 当客户端发起connect请求的时触发,发起connect请求通常在HTTP代理时候出现,如果不见听这个事件,发起该请求的连接就会关闭。
  5. upgrade事件: 当客户端要求升级连接协议的时候,需要和服务端协商。客户端才会在请求中带上upgrade字段
  6. clientError事件: 连接的客户端会触发error事件,这个错误会传递到服务器端。

HTTP客户端

  1. host: 服务器的域名和ip地址
  2. hostname: 服务器名称
  3. port: 服务器端口
  4. localAddress: 建立网络连接的本地网卡
  5. socketPath: Domain套接字连接路径
  6. method: http请求方法
  7. path: 请求路径,默认为/
  8. header: 请求头对象
  9. auth:basic认证,用于计算请求头中的Authorization部分
HTTP响应

HTTP客户端的响应对象和服务器端较为相似。

function(res) {res.setEncoding('utf-8')res.on('data', function(chunk) {console.log(chunk)})
}
http代理

在keepalive的情况下,一个底层会话可以用于多次请求,为了重用tcp连接,http模块包含了一个默认的客户端代理对象Http.globalAgent,对于服务器端的创建的连接进行了连接,实际上是一个线程池。
在这里插入图片描述

调用HTTP客户端同时对一个服务器发起10个HTTP请求uid时候,实际上是只有5个请求处于并发状态,后续的请求需要等待某个请求完成服务后真正发出。

http客户端事件
  1. response
  2. socket:当底层连接池中建立的连接分配给当前请求对象时,触发该事件。
  3. connect:当客户端向服务器端发起CONNECT请求时,如果服务器端响应了200状态码,客户端将会触发该事件。
  4. upgrade:客户端向服务器端发起Upgrade请求时,如果服务器端响应了101 SwitchingProtocols状态,客户端将会触发该事件。
  5. continue:客户端向服务器端发起Expect:100-continue头信息,以试图发送较大数据量如果服务器端响应100 Continue状态,客户端将触发该事件。

相关文章:

Nodejs-- 网络编程

网络编程 构建tcp服务 TCP tcp全名为传输控制协议。再osi模型中属于传输层协议。 tcp是面向连接的协议,在传输之前需要形成三次握手形成会话 只有会话形成了,服务端和客户端才能想发送数据,在创建会话的过程中,服务端和客户…...

React@16.x(14)context 举例 - Form 表单

目录 1,目标2,实现2.1,index.js2.2,context.js2.2,Form.Input2.3,Form.Button 3,使用 1,目标 上篇文章说到,context 上下文一般用于第3方组件库,因为使用场景…...

十几款基于ChatGPT的免费神器,每个都是王炸!

十几款基于ChatGPT的免费神器,每个都是王炸! 1、ChatGPT ChatGPT非常强大,但注册需要魔法和国外的手机号,大部分人都没法使用。还好有一些基于API开发的体验版,我收集了一些可以直接使用的站点分享给大家&#xff0c…...

devicemotion 或者 deviceorientation在window.addEventListener 事件中不生效,没有输出内容

问题&#xff1a;devicemotion 或者 deviceorientation 在window.addEventListener 事件中不生效&#xff0c;没有输出内容 原因&#xff1a; 1、必须在Https协议下才可使用 2、必须用户手动点击click事件中调用 &#xff0c;进行权限申请 源码&#xff1a; <!DOCTYPE h…...

java单元测试如何断言异常

​ 在junit单元测试中&#xff0c;我们可以使用 org.junit.Assert.assertThrows 包下的 assertThrows() 方法 这个方法返回了一个泛型的异常 public static <T extends Throwable> assertThrows(Class<T> expectedType, Executable executable)​ 假设我们有以下…...

C语言| n的阶乘相加

逻辑性较强&#xff0c;建议记住。 分析思路&#xff1a; 假如n4&#xff1a;m m * i; sum sum m; 1&#xff09;当i1时&#xff0c;m1, sum1。 2&#xff09;当i2时&#xff0c;m12, sum112。 3&#xff09;当i3时&#xff0c;m123, sum112123。 4&#xff09;当i4时&…...

cwiseMax、cwiseMin函数

一、cwiseMax含义 cwiseMax是Eigen库中的一个函数&#xff0c;用于求两个矩阵或向量的逐元素最大值。它的作用类似于std::max函数&#xff0c;但是可以同时处理多个元素&#xff0c;且支持矩阵和向量。 举例&#xff1a; 例如&#xff0c;对于两个向量a和b&#xff0c;cwiseMax…...

【thinkphp问题栏】tp5.1重写URL,取消路径上的index.php

在Apache运行thinkphp5.1时&#xff0c;发现系统默认生成的.htaccess不生效。 首先先查看怎么修改伪静态 1、修改Apache的配置文件 在Apache的安装目录下&#xff0c;打开config/httpd.conf。 搜索rewrite.so&#xff0c;将前面的#删掉&#xff0c;表示开启URL重写功能 2、…...

缓冲字符流

BufferedReader/BufferedWriter增加了缓存机制&#xff0c;大大提高了读写文本文件的效率。 字符输入缓冲流 BufferedReader是针对字符输入流的缓冲流对象&#xff0c;提供了更方便的按行读取的方法&#xff1a;readLine();在使用字符流读取文本文件时&#xff0c;我们可以使…...

Django中使用Celery和APScheduler实现定时任务

在之前的文章我们已经学习了Celery和APScheduler的基本使用&#xff0c;下面让我们来了解一下如何在Django中使用Celery和APScheduler Celery 1.前提工作 python 3.7 pip install celery pip install eventlet #5.0版本以下 pip install importlib-metadata4.8.3&#xff08…...

Kivy.uix.textinput

一个小小的输入框&#xff0c;纵上下数页文档已不能全不概括&#xff0c;当去源码慢慢寻找&#xff0c;才知道其中作用&#xff0c;才能运用灵活。 Text Input — Kivy 2.3.0 documentation # -*- encoding: utf-8 -*-Text Input .. versionadded:: 1.0.4.. image:: images/te…...

基于IoTDB 平台的学习和研究

Apache IoTDB&#xff08;物联网数据库&#xff09;是一个针对物联网领域的高性能原生数据库&#xff0c;适用于数据管理和分析&#xff0c;并可在边缘计算和云端部署。由于它轻量级的架构、高性能和丰富的功能集&#xff0c;以及与Apache Hadoop、Spark和Flink的深度集成&…...

nessus plugins目录为空的问题

想要避免这种问题&#xff0c;可以将nessus服务设置为手动&#xff0c;并且先停止nessus服务。 批处理脚本&#xff1a; 下面的/~/Nessus/plugin_feed_info.inc替换成你配置好的 plugin_feed_info.inc 所在的路径 service nessusd stop; cp /~/Nessus/plugin_feed_info.inc …...

FDW(Foreign Data Wrapper)

在上一篇博客里&#xff0c;最末尾提到了 FDW。pg 实现了数百个 fdw 插件&#xff0c;用于访问外部数据。 FDW 到底是什么呢&#xff1f; 标准 FDW&#xff08;Foreign Data Wrapper&#xff09;遵循了 SQL/MED 标准&#xff0c;标准全称&#xff1a;ISO/IEC 9075-9 Managem…...

Flutter开发指南

Flutter开发指南&#xff08;Android 开发角度&#xff09; 与Android 的对比 1.Android 的View 与Flutter 的对应关系&#xff1a; a.在android 中&#xff0c;view 是屏幕显示的基础&#xff0c;比如 button&#xff0c;文本&#xff0c;列表&#xff0c;输入框都是 view。…...

SpringCloud学习笔记万字整理(无广版在博客)

在此感谢黑马程序员的SpringCloud课程 所有笔记、生活分享首发于个人博客 想要获得最佳的阅读体验&#xff08;无广告且清爽&#xff09;&#xff0c;请访问本篇笔记 认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐…...

c++(七)

c&#xff08;七&#xff09; 内联函数内联函数的特点为什么要有内联函数内联函数是如何工作的呢 类型转换异常处理智能指针单例模式懒汉模式饿汉模式 VS中数据库的相关配置 内联函数 修饰类的成员函数&#xff0c;关键字&#xff1a;inline inline 返回值类型 函数名(参数列…...

SQL语言

SQL语言 导航 文章目录 SQL语言导航一、SQL概述SQL 二、数据库定义SQL 数据类型 三、数据操作视图更新 四、SQL的授权五、存储过程六、嵌入式SQL主语言与数据库通信 七、动态SQL 一、SQL概述 SQL 支持三级模式结构 视图->外模式 基本表->模式 存储文件->内模式 二…...

【PPT】修改新建文本框默认字体

【PPT】修改新建文本框默认字体...

智能办公本如何选择

智能办公本如何选择 引言 随着科技的不断发展&#xff0c;智能办公本已成为现代职场人士的重要工具。它们不仅具备传统纸质笔记本的书写体验&#xff0c;还融入了先进的智能技术&#xff0c;让办公变得更加高效便捷。在选择智能办公本时&#xff0c;我们需要关注多个方面&…...

Spark基础:Scala变量与数据类型

在Scala中&#xff0c;变量和数据类型是编程的基础。Scala作为一种强大的静态类型语言&#xff0c;支持多种数据类型&#xff0c;并提供了可变&#xff08;var&#xff09;和不可变&#xff08;val&#xff09;两种类型的变量声明方式。以下是在Scala中变量和数据类型的基础知识…...

php 实现:给图片加文字水印,图片水印,压缩图片

演示环境&#xff1a; 1、windows10 2、phpstudy 3、php7.4 一、案例演示&#xff1a; 二、素材准备 1、准备一张原始图片 2、准备一张水印图片&#xff08;透明底图的最好&#xff09; 3、字体库&#xff08;windows系统自带的字体库&#xff0c;路径在&#xff1a;C:\Window…...

免费实现网站HTTPS访问

HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种基于SSL协议的HTTP安全协议&#xff0c;旨在为客户端&#xff08;浏览器&#xff09;与服务器之间的通信提供加密通道&#xff0c;确保数据在传输过程中的保密性、完整性和身份验证。与传统的HTTP相比&a…...

vue3使用vue3-print-nb打印

打印效果 1.下载插件 Vue2.0版本安装方法 npm install vue-print-nb --saveVue3.0版本安装方法&#xff1a; npm install vue3-print-nb --save2.main.js引入 vue2引入 import Print from vue-print-nb Vue.use(Print)vue3引入 import print from vue3-print-nb // 打印…...

R语言ggplot2包绘制网络地图

重要提示&#xff1a;数据和代码获取&#xff1a;请查看主页个人信息&#xff01;&#xff01;&#xff01; 载入R包 rm(listls()) pacman::p_load(tidyverse,assertthat,igraph,purrr,ggraph,ggmap) 网络节点和边数据 nodes <- read.csv(nodes.csv, row.names 1) edges…...

php获取今天凌晨零点的时间

不废话直接上代码 //使用strtotime $midnightToday strtotime("today midnight"); //输出&#xff1a;1716998400 //如果是明天 $midnightToday 86400 //后天 $midnightToday 86400*2//ORM中比对使用 $row ModelVisit::where(uid,$this->uid)->where(visi…...

CATIA进阶操作——创成式曲面设计入门(1)线架设计,三维点、直线、平面、曲线

目录 引出三维空间点生成三维直线三维平面三维曲线总结异形弹簧新建几何体草图编辑&#xff0c;画一条样条线进行扫掠&#xff0c;圆心和半径画出曲面上的螺旋线再次选择扫掠&#xff0c;圆心和半径 其他自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自定义信号重…...

thinkphp6中怎么查看ThinkPHP版本号

<?php namespace app\controller; use app\BaseController; use think\app; //这句 class Index extends BaseController { public function test() { echo App::VERSION; //还有这句 } }...

第十二章 创建Web客户端

文章目录 第十二章 创建Web客户端SOAP向导的概述使用SOAP向导 第十二章 创建Web客户端 web客户端是访问web服务的软件。web客户端提供了一组代理方法&#xff0c;每个方法对应于web服务的一个方法。代理方法使用与它所对应的web服务方法相同的签名&#xff0c;并在被请求时调用…...

调试记录-RK平台用指令开启ADB功能

需求 嵌入式Linux系统调试过程中&#xff0c;为了方便&#xff0c;我们会借鉴Android调试的方法&#xff0c;在Linux系统添加adb功能&#xff0c;主要功能是通过USB线连接开发板和PC&#xff0c;实现两者之间传输文件&#xff0c;在PC上执行指令操作开发板。 实现 前提&…...

奇安信_NAC终端安全准入系统(相关问题整理)

奇安信终端安全准入系统 ,下称NAC 一、入网控制方式 1.IP流量控制 2.802.1X 准入 需要NAC、交换机、终端 以802.1X 3.DHCP 准入 将NAC作为DHCP服务器&#xff0c;为客户端分配地址&#xff0c;并对分配地址的客户端进行入网管控。 &#xff08;*&#xff09;可选 强制入网…...

在iPhone上恢复已删除的Safari历史记录的最佳方法

您是否正在寻找恢复 iPhone 上已删除的 Safari 历史记录的最佳方法&#xff1f;好吧&#xff0c;这篇文章提供了 4 种在有/无备份的情况下恢复 iPhone 上已删除的 Safari 历史记录的最佳方法。现在按照分步指南进行操作。 iPhone 上的 Safari 历史记录会被永久删除吗&#xff1…...

【设计模式深度剖析】【7】【结构型】【享元模式】| 以高脚杯重复使用、GUI中的按钮为例说明,并对比Java类库设计加深理解

&#x1f448;️上一篇:外观模式 | 下一篇:结构型设计模式对比&#x1f449;️ 设计模式-专栏&#x1f448;️ 目录 享元模式定义英文原话直译如何理解&#xff1f;字面理解例子&#xff1a;高脚杯的重复使用例子&#xff1a;GUI中的按钮传统方式使用享元模式 4个角色1. …...

OceanBase 内存研究(OceanBase 3.2.4.5)

内存结构 从官网的结构图可以看出&#xff0c;一台observer可使用的总内存(memory_limit)包括 系统内存(system_memory) 和 租户内存(sys租户与普通租户) 系统内存 系统内存system_memory 属于 observer 的内部内存&#xff0c;允许其它租户共享使用该内存资源 (root10.0.0.…...

麒麟系统 安装xrdp 远程桌面方法记录

一、安装环境 麒麟V10 2107 ft2000 麒麟V10 2107 x86_64 二、安装准备 使用《Kylin-Desktop-V10-Release-2107-arm64.iso》镜像 做好U盘启动系统后&#xff0c;需要安装一个远程桌面工具&#xff0c;可以多用户在windows上使用远程桌面访问麒麟系统。 目前在linux系统上较…...

解析Java中1000个常用类:SafeVarargs类,你学会了吗?

在 Java 编程中,泛型和可变参数(varargs)的结合使用可能会导致一些类型安全的问题。为了解决这些问题,Java 提供了 @SafeVarargs 注解。本文将详细介绍 @SafeVarargs 注解的定义、使用方法、应用场景以及其背后的原理,帮助读者深入理解并掌握这一重要特性。 什么是 @Safe…...

【数据挖掘】3σ原则识别数据中的异常值(附代码)

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…...

人眼是如何看到物体的

我在试图理解人眼如何观察到物体的&#xff0c;发现没有解释。本来我想这应该跟照相机照相的结果一样&#xff0c;但是发现&#xff0c;照相机也不对劲&#xff0c;没有理由能成像啊。 因为物体在散射光的时候&#xff0c;假设散射的光在局部是平行光&#xff0c;那么物体散射…...

vue打包时报错文件包过大

1.问题&#xff1a;npm run build 之后出现 2. 翻译之后意思就是某块过大 3. 解决办法&#xff1a;在vite.config.ts文件上添加 build: { chunkSizeWarningLimit: 1600, }, 4.最终打包...

预编码算法(个人总结)

引言 预编码算法是现代无线通信系统中的关键技术&#xff0c;特别是在多输入多输出&#xff08;MIMO&#xff09;系统中。它们通过在发送端对信号进行处理&#xff0c;减少干扰并提高信道容量。这种技术广泛应用于5G、Wi-Fi和卫星通信系统中。本教程将详细介绍预编码算法的背景…...

【重学C语言】十七、预处理指令

【重学C语言】十七、预处理指令 预处理指令预定义宏`#define` 宏定义示例注意事项特殊符号条件编译头文件包含`#pragma`预处理指令 C语言中的预处理指令(Preprocessor Directives)是一种特殊的指令,它们在编译过程的早期阶段(即实际编译之前)被预处理器(Preprocessor)处…...

SQL注入的危害和原理

在Web应用开发中&#xff0c;SQL注入是一种常见的安全漏洞&#xff0c;它允许攻击者通过注入恶意的SQL语句来执行非法操作&#xff0c;甚至获取敏感数据。本篇博客将详细解释SQL注入的危害和原理&#xff0c;并提供一些解决方案&#xff0c;以帮助新人快速理解并避免这种安全威…...

Unity2D横版摄像机跟随

在Unity2D横版游戏中&#xff0c;摄像机跟随是一个非常重要的功能。一个流畅的摄像机跟随系统可以让玩家更好地沉浸在游戏世界中。本文将介绍如何在Unity中实现2D横版摄像机跟随&#xff0c;并分享一些优化技巧。 一、准备工作 在开始实现摄像机跟随之前&#xff0c;请确保您…...

Practicing Version Control

Part A 新建一个文件夹Git&#xff0c;然后进入文件夹: Windows: 在这个文件夹中右键 > Open Git Bash hereMac: 运行终端&#xff0c;打cd 空格&#xff0c;然后将文件夹拖入终端&#xff0c;按 return 从 Github 上复制 HTTPS&#xff0c;然后 git clone https://githu…...

新宏观范式和产业趋势下,纷享销客如何助力企业出海?

出海&#xff0c;已不再是企业的“备胎”&#xff0c;而是必须面对的“大考”&#xff01;在这个全球化的大潮中&#xff0c;有的企业乘风破浪&#xff0c;勇攀高峰&#xff0c;也有的企业在异国他乡遭遇了“水土不服”。 面对“要么出海&#xff0c;要么出局”的抉择&#xff…...

安装zookeeper

一、搭建前准备 192.168.1.99 sdw1 192.168.1.98 sdw2 192.168.1.97 sdw3 二、搭建 1、各主机修改/etc/hosts&#xff0c;/etc/hostname文件 /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhos…...

深入分析 Android Activity (二)

文章目录 深入分析 Android Activity (二)1. Activity 的启动模式&#xff08;Launch Modes&#xff09;1.1 标准模式&#xff08;standard&#xff09;1.2 单顶模式&#xff08;singleTop&#xff09;1.3 单任务模式&#xff08;singleTask&#xff09;1.4 单实例模式&#xf…...

数据结构——经典链表OJ(二)

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 点击主页&#xff1a;optimistic_chen和专栏&#xff1a;c语言&#xff0c; 创作不易&#xff0c;大佬们点赞鼓…...

文件IO(三)

文件IO&#xff08;三&#xff09; 左移右移Linux的man 手册文件IO打开文件操作文件关闭文件 caps lock开灯关灯读取按键文件IO操作目录文件打开目录文件操作目录文件 库动态库和静态库的优缺点创建静态库创建动态库 按下右ctrl键 亮灭灯 左移右移 Linux的man 手册 文件IO 打开…...

单实例11.2.0.3迁移到RAC11.2.0.4_使用RMAN 异机恢复

保命法则&#xff1a;先备份再操作&#xff0c;磁盘空间紧张无法备份就让满足&#xff0c;给自己留退路。 场景说明&#xff1a; 1.本文档的环境为同平台、不同版本&#xff08;操作系统版本可以不同&#xff0c;数据库小版本不同&#xff09;&#xff0c;源机器和目标机器部…...