西城网站建设浩森宇特沈阳单页网站制作

news/2025/9/27 19:48:36/文章来源:
西城网站建设浩森宇特,沈阳单页网站制作,大连甘井子区教育局,wordpress 城市分类Powered by:NEFU AB-IN 文章目录 Go 语言的实战案例 SOCKS5 代理 | 青训营 引入TCP echo serverauth 认证请求阶段relay阶段 Go 语言的实战案例 SOCKS5 代理 | 青训营 GO语言工程实践课后作业#xff1a;实现思路、代码以及路径记录 引入 代理是指在计算机网络中#xff…Powered by:NEFU AB-IN 文章目录 Go 语言的实战案例 SOCKS5 代理 | 青训营 引入TCP echo serverauth 认证请求阶段relay阶段 Go 语言的实战案例 SOCKS5 代理 | 青训营 GO语言工程实践课后作业实现思路、代码以及路径记录 引入 代理是指在计算机网络中代理服务器充当客户端和目标服务器之间的中介。它接收来自客户端的请求然后将请求转发给目标服务器再将目标服务器的响应返回给客户端。 用途 匿名浏览Socks5代理可以隐藏客户端的真实IP地址使得客户端在访问目标服务器时更加匿名。可以代表客户端向其他服务器发送请求 在网络爬虫中使用代理服务器可以解决IP访问频率限制问题因为它们可以隐藏真实的客户端IP地址并提供新的IP地址来进行请求从而减轻对单个IP的访问频率限制。这样爬虫就可以通过多个代理IP来轮流发送请求避免被目标服务器封禁。 数据加密Socks5代理支持对数据流进行加密传输提供更高的数据安全性。 跨协议代理Socks5代理不仅支持HTTP协议还支持包括FTP、SMTP等在内的多种协议实现了更广泛的应用场景。 穿越防火墙由于Socks5代理更通用不受网络防火墙的限制可以更容易地穿越网络防火墙访问被封锁或限制的资源。 Socks5代理是一种代理协议用于在网络上进行数据传输。Socks5代理服务器可以支持多种协议的代理包括HTTP、FTP、SMTP等。与HTTP代理相比Socks5代理更加灵活和通用。 主要区别如下 HTTP代理主要用于HTTP请求支持浏览器的代理设置透明代理Socks5代理支持HTTP以外的其他协议的代理不支持浏览器的代理设置需要在应用程序中设置代理Socks5代理的主要特点是它可以在客户端和代理服务器之间建立一个 TCP 或 UDP 连接并直接将数据转发给目标服务器而不需要解析或修改数据包。这种特性使得SOCKS5代理适用于很多不同类型的网络应用如 P2P 文件共享、实时视频传输等。 代理过程通常如下 客户端向代理服务器发送连接请求并指定目标服务器的地址。代理服务器接收到请求后解析目标服务器地址并建立与目标服务器的连接。代理服务器将客户端的请求转发给目标服务器。目标服务器接收到请求后处理请求并生成响应。代理服务器将目标服务器的响应转发给客户端。客户端接收到代理服务器返回的响应并进行处理。 总的来说代理服务器充当了客户端和目标服务器之间的中转站使得客户端能间接与目标服务器进行通信提供了更多的隐私保护和功能扩展。 TCP echo server /** Author: NEFU AB-IN* Date: 2023-08-23 22:36:26* FilePath: \GoTest\6\6.go* LastEditTime: 2023-08-23 22:43:57*/ package mainimport (bufiolognet )// TCP echo serverfunc main() {server, err : net.Listen(tcp, 127.0.0.1:1080) // 监听端口返回一个serverif err ! nil {panic(err)}for {client, err : server.Accept() // 在死循环里用这个方法接收一个请求if err ! nil {log.Printf(Accept failed %v, err)continue}go process(client) // 处理这个链接 go关键字 启动子线程去处理// 如果接受连接时出现错误服务器会记录错误信息然后继续等待下一个客户端连接// 否则为每个客户端连接启动一个独立的process协程来处理客户端请求这样可以并发处理多个客户端连接。} }func process(conn net.Conn) {defer conn.Close() // 最后将连接关掉reader : bufio.NewReader(conn) // 基于这个链接创造一个只读的带缓冲的流for {b, err : reader.ReadByte() // 每次读一个字节if err ! nil {break}_, err conn.Write([]byte{b}) // 将读取的字节回显给客户端直接写回到连接中if err ! nil {break}} }auth 认证 认证阶段实现auth函数更改process函数里面用到auth函数 /** Author: NEFU AB-IN* Date: 2023-08-23 22:50:05* FilePath: \GoTest\7\7.go* LastEditTime: 2023-08-23 22:50:11*/ package mainimport (bufiofmtiolognet ) // 一些常量定义用于表示Socks5协议中的一些数值例如协议版本、命令类型和地址类型等。 const socks5Ver 0x05 const cmdBind 0x01 const atypeIPV4 0x01 const atypeHOST 0x03 const atypeIPV6 0x04func main() {server, err : net.Listen(tcp, 127.0.0.1:1080)if err ! nil {panic(err)}for {client, err : server.Accept()if err ! nil {log.Printf(Accept failed %v, err)continue}go process(client)} }func process(conn net.Conn) {defer conn.Close()reader : bufio.NewReader(conn)err : auth(reader, conn)if err ! nil {log.Printf(client %v auth failed:%v, conn.RemoteAddr(), err)return}log.Println(auth success) }func auth(reader *bufio.Reader, conn net.Conn) (err error) {// 第一步浏览器向代理服务器发送报文三个字段// ------------------------// |VER | NMETHODS | METHODS |// ------------------------// | 1 | 1 | 1 to 255 |// ------------------------// VER: 协议版本socks5为0x05// NMETHODS: 支持认证的方法数量// METHODS: 对应NMETHODSNMETHODS的值为多少METHODS就有多少个字节。// RFC预定义了一些值的含义内容如下:// X’00’ NO AUTHENTICATION REQUIRED// X’02’ USERNAME/PASSWORD// 前两个字段都是单字节所以从流中单独读出ver, err : reader.ReadByte()if err ! nil {return fmt.Errorf(read ver failed:%w, err)}if ver ! socks5Ver {return fmt.Errorf(not supported ver:%v, ver)}methodSize, err : reader.ReadByte()if err ! nil {return fmt.Errorf(read methodSize failed:%w, err)}method : make([]byte, methodSize) // 创建缓冲区_, err io.ReadFull(reader, method) // 它会从r中连续读取数据直到buf被填满或者遇到了一个错误。如果读取完整的buf之前发生错误函数会返回读取的字节数n和错误信息err如果成功读取了整个buf函数会返回buf的长度和nil。 // 这个函数在需要确保读取完整数据包时很有用比如读取固定长度的消息、解码二进制数据等。if err ! nil {return fmt.Errorf(read method failed:%w, err)}log.Println(ver, ver, method, method)// ------------// |VER | METHOD |// ------------// | 1 | 1 |// ------------_, err conn.Write([]byte{socks5Ver, 0x00})if err ! nil {return fmt.Errorf(write failed:%w, err)}return nil } 请求阶段 请求阶段实现connect函数签名一致在process中调用 package mainimport (bufioencoding/binaryerrorsfmtiolognet )const socks5Ver 0x05 const cmdBind 0x01 const atypeIPV4 0x01 const atypeHOST 0x03 const atypeIPV6 0x04func main() {server, err : net.Listen(tcp, 127.0.0.1:1080)if err ! nil {panic(err)}for {client, err : server.Accept()if err ! nil {log.Printf(Accept failed %v, err)continue}go process(client)} }func process(conn net.Conn) {defer conn.Close()reader : bufio.NewReader(conn)err : auth(reader, conn)if err ! nil {log.Printf(client %v auth failed:%v, conn.RemoteAddr(), err)return}err connect(reader, conn)if err ! nil {log.Printf(client %v auth failed:%v, conn.RemoteAddr(), err)return} }func auth(reader *bufio.Reader, conn net.Conn) (err error) {// ------------------------// |VER | NMETHODS | METHODS |// ------------------------// | 1 | 1 | 1 to 255 |// ------------------------// VER: 协议版本socks5为0x05// NMETHODS: 支持认证的方法数量// METHODS: 对应NMETHODSNMETHODS的值为多少METHODS就有多少个字节。RFC预定义了一些值的含义内容如下:// X’00’ NO AUTHENTICATION REQUIRED// X’02’ USERNAME/PASSWORDver, err : reader.ReadByte()if err ! nil {return fmt.Errorf(read ver failed:%w, err)}if ver ! socks5Ver {return fmt.Errorf(not supported ver:%v, ver)}methodSize, err : reader.ReadByte()if err ! nil {return fmt.Errorf(read methodSize failed:%w, err)}method : make([]byte, methodSize)_, err io.ReadFull(reader, method)if err ! nil {return fmt.Errorf(read method failed:%w, err)}// ------------// |VER | METHOD |// ------------// | 1 | 1 |// ------------_, err conn.Write([]byte{socks5Ver, 0x00})if err ! nil {return fmt.Errorf(write failed:%w, err)}return nil }func connect(reader *bufio.Reader, conn net.Conn) (err error) { // 第二步浏览器发送报文包含六个字段// ------------------------------------------// |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |// ------------------------------------------// | 1 | 1 | X00 | 1 | Variable | 2 |// ------------------------------------------// VER 版本号socks5的值为0x05// CMD 0x01表示CONNECT请求// RSV 保留字段值为0x00// ATYP 目标地址类型DST.ADDR的数据对应这个字段的类型。// 0x01表示IPv4地址DST.ADDR为4个字节// 0x03表示域名DST.ADDR是一个可变长度的域名// DST.ADDR 一个可变长度的值// DST.PORT 目标端口固定2个字节// !!!! 可以看到前四个字段都是单字节可以采用之前的方法一个个读出来这里直接构造一个4字节的缓冲区用readfull全读出来buf : make([]byte, 4)_, err io.ReadFull(reader, buf)if err ! nil {return fmt.Errorf(read header failed:%w, err)}ver, cmd, atyp : buf[0], buf[1], buf[3]if ver ! socks5Ver {return fmt.Errorf(not supported ver:%v, ver)}if cmd ! cmdBind {return fmt.Errorf(not supported cmd:%v, cmd)}addr : switch atyp {case atypeIPV4: // 若是IPV4 读四个字节_, err io.ReadFull(reader, buf)if err ! nil {return fmt.Errorf(read atyp failed:%w, err)}addr fmt.Sprintf(%d.%d.%d.%d, buf[0], buf[1], buf[2], buf[3])case atypeHOST: // 若是域名先读长度构造缓冲区最后转换为字符串hostSize, err : reader.ReadByte()if err ! nil {return fmt.Errorf(read hostSize failed:%w, err)}host : make([]byte, hostSize)_, err io.ReadFull(reader, host)if err ! nil {return fmt.Errorf(read host failed:%w, err)}addr string(host)case atypeIPV6: // 先不实现IPV6return errors.New(IPv6: no supported yet)default:return errors.New(invalid atyp)}_, err io.ReadFull(reader, buf[:2]) // 这里复用之前的缓冲区切片效果只用前两位填充满if err ! nil {return fmt.Errorf(read port failed:%w, err)}port : binary.BigEndian.Uint16(buf[:2]) // 用于将 2 字节的大端序字节序列解码为一个无符号 16 位整数uint16。log.Println(dial, addr, port)// 给予回报// ------------------------------------------// |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |// ------------------------------------------// | 1 | 1 | X00 | 1 | Variable | 2 |// ------------------------------------------// VER socks版本这里为0x05// REP Relay field,内容取值如下 X’00’ succeeded// RSV 保留字段// ATYPE 地址类型// BND.ADDR 服务绑定的地址// BND.PORT 服务绑定的端口DST.PORT_, err conn.Write([]byte{0x05, 0x00, 0x00, 0x01, 0, 0, 0, 0, 0, 0}) // 拼成byte数组if err ! nil {return fmt.Errorf(write failed: %w, err)}return nil }relay阶段 relay阶段最后一步真正和服务器建立TCP连接在 connect 函数中增加功能 package mainimport (bufiocontextencoding/binaryerrorsfmtiolognet )const socks5Ver 0x05 const cmdBind 0x01 const atypeIPV4 0x01 const atypeHOST 0x03 const atypeIPV6 0x04func main() {server, err : net.Listen(tcp, 127.0.0.1:1080)if err ! nil {panic(err)}for {client, err : server.Accept()if err ! nil {log.Printf(Accept failed %v, err)continue}go process(client)} }func process(conn net.Conn) {defer conn.Close()reader : bufio.NewReader(conn)err : auth(reader, conn)if err ! nil {log.Printf(client %v auth failed:%v, conn.RemoteAddr(), err)return}err connect(reader, conn)if err ! nil {log.Printf(client %v auth failed:%v, conn.RemoteAddr(), err)return} }func auth(reader *bufio.Reader, conn net.Conn) (err error) {// ------------------------// |VER | NMETHODS | METHODS |// ------------------------// | 1 | 1 | 1 to 255 |// ------------------------// VER: 协议版本socks5为0x05// NMETHODS: 支持认证的方法数量// METHODS: 对应NMETHODSNMETHODS的值为多少METHODS就有多少个字节。RFC预定义了一些值的含义内容如下:// X’00’ NO AUTHENTICATION REQUIRED// X’02’ USERNAME/PASSWORDver, err : reader.ReadByte()if err ! nil {return fmt.Errorf(read ver failed:%w, err)}if ver ! socks5Ver {return fmt.Errorf(not supported ver:%v, ver)}methodSize, err : reader.ReadByte()if err ! nil {return fmt.Errorf(read methodSize failed:%w, err)}method : make([]byte, methodSize)_, err io.ReadFull(reader, method)if err ! nil {return fmt.Errorf(read method failed:%w, err)}// ------------// |VER | METHOD |// ------------// | 1 | 1 |// ------------_, err conn.Write([]byte{socks5Ver, 0x00})if err ! nil {return fmt.Errorf(write failed:%w, err)}return nil }func connect(reader *bufio.Reader, conn net.Conn) (err error) {// ------------------------------------------// |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |// ------------------------------------------// | 1 | 1 | X00 | 1 | Variable | 2 |// ------------------------------------------// VER 版本号socks5的值为0x05// CMD 0x01表示CONNECT请求// RSV 保留字段值为0x00// ATYP 目标地址类型DST.ADDR的数据对应这个字段的类型。// 0x01表示IPv4地址DST.ADDR为4个字节// 0x03表示域名DST.ADDR是一个可变长度的域名// DST.ADDR 一个可变长度的值// DST.PORT 目标端口固定2个字节buf : make([]byte, 4)_, err io.ReadFull(reader, buf)if err ! nil {return fmt.Errorf(read header failed:%w, err)}ver, cmd, atyp : buf[0], buf[1], buf[3]if ver ! socks5Ver {return fmt.Errorf(not supported ver:%v, ver)}if cmd ! cmdBind {return fmt.Errorf(not supported cmd:%v, cmd)}addr : switch atyp {case atypeIPV4:_, err io.ReadFull(reader, buf)if err ! nil {return fmt.Errorf(read atyp failed:%w, err)}addr fmt.Sprintf(%d.%d.%d.%d, buf[0], buf[1], buf[2], buf[3])case atypeHOST:hostSize, err : reader.ReadByte()if err ! nil {return fmt.Errorf(read hostSize failed:%w, err)}host : make([]byte, hostSize)_, err io.ReadFull(reader, host)if err ! nil {return fmt.Errorf(read host failed:%w, err)}addr string(host)case atypeIPV6:return errors.New(IPv6: no supported yet)default:return errors.New(invalid atyp)}_, err io.ReadFull(reader, buf[:2])if err ! nil {return fmt.Errorf(read port failed:%w, err)}port : binary.BigEndian.Uint16(buf[:2])// 建立浏览器和服务器的双向数据转换使用 net.Dial 函数连接到目标服务器 dest即客户端所请求的远程服务器。这样就建立了代理服务器与目标服务器之间的连接。dest, err : net.Dial(tcp, fmt.Sprintf(%v:%v, addr, port))if err ! nil {return fmt.Errorf(dial dst failed:%w, err)}defer dest.Close()log.Println(dial, addr, port)// ------------------------------------------// |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |// ------------------------------------------// | 1 | 1 | X00 | 1 | Variable | 2 |// ------------------------------------------// VER socks版本这里为0x05// REP Relay field,内容取值如下 X’00’ succeeded// RSV 保留字段// ATYPE 地址类型// BND.ADDR 服务绑定的地址// BND.PORT 服务绑定的端口DST.PORT// 返回连接成功的报文_, err conn.Write([]byte{0x05, 0x00, 0x00, 0x01, 0, 0, 0, 0, 0, 0})if err ! nil {return fmt.Errorf(write failed: %w, err)}// 这段代码的主要功能是实现两个goroutine并行执行io.Copy操作并在其中一个goroutine完成后取消另一个goroutine的执行。 //- 第一行创建一个新的上下文对象ctx并使用context.Background()作为根上下文对象。这个上下文对象用于在不同goroutine之间传递取消信号。 //- 第二行定义了一个cancel函数用于取消上下文对象ctx。defer关键字用于延迟执行cancel函数在函数返回时自动调用。 //- 第四行开启了一个goroutine该goroutine负责将读取到的数据从reader复制到dest并在复制完成后调用cancel函数取消上下文对象的执行。这样做是为了在复制完成后能正确地通知另一个goroutine停止执行。 //- 第六行开启了第二个goroutine该goroutine负责将dest的数据复制到conn并在复制完成后也调用cancel函数取消上下文对象的执行。 //- 第九行使用-ctx.Done()语法表示等待上下文对象ctx被取消。一旦ctx被取消即ctx.Done()返回程序会继续往下执行。ctx, cancel : context.WithCancel(context.Background())defer cancel()go func() {_, _ io.Copy(dest, reader)cancel()}()go func() {_, _ io.Copy(conn, dest)cancel()}()-ctx.Done() // 阻塞等待直到两个数据转发的Go协程都完成后函数返回。执行时机也就是cancel的时间。return nil }ctx, cancel : context.WithCancel(context.Background())解释 上下文对象是 Go 语言中用于跨 goroutine 传递请求的值、截止时间以及取消信号的一种机制。它可以用来解决在并发环境下协调多个 goroutine 之间的操作和通信的问题。 上下文对象通常用于以下几种情况 传递请求的相关值例如请求ID、用户信息等在多个 goroutine 之间共享。设置截止时间对某些操作设置一个超时时间用于控制操作的执行时间。取消信号当一个操作出现问题或者不再需要执行时可以通过取消上下文对象来通知相关的 goroutine 停止执行。 context.WithCancel(context.Background()) 这句代码的意思是创建一个具有取消功能的上下文对象WithCancel()函数接受一个 Context 并返回其子Context和取消函数cancel。context.Background() 创建一个根上下文对象而 context.WithCancel 则基于根上下文对象创建一个新的上下文对象该上下文对象具有取消功能。返回的 ctx 和 cancel 是用于取消该上下文对象的函数。 所以这句代码的作用就是创建一个新的上下文对象 ctx并使用 context.WithCancel 函数将其绑定到一个取消函数 cancel 上。这样可以通过调用 cancel 函数来取消该上下文对象的执行。该上下文对象可以被传递给其他需要依赖上下文的 goroutine 来实现协作和取消的功能。

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

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

相关文章

数据结构——链表 - 详解

数据结构——链表 - 详解2025-09-27 19:42 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fo…

25秋周总结4

总结 上周的两场联考我觉得考得很烂,其实难度和之前我打 200、300 是差不多的,但是为什么自己打得如此糟糕呢?我认为是自己思考问题的方式有问题,导致我的发挥不稳定。就像我在联考总结里面说的:我的思路历程在前…

html静态网站开发个人博客微商城 手机网站

目录 Tensor在神经网络中的角色 实现权重聚合的算法 1. Tensor的基本概念 2. Tensor的数据结构举例 一维Tensor(向量) 二维Tensor(矩阵) 三维及以上Tensor 3. Tensor的内部结构 4. Tensor的操作 Tensor数据结构示例 示例Tensor内容(部分) model.state_dict(…

Python 潮流周刊#121:工程师如何做出高效决策?

本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。 温馨提…

饥荒联机版

info 角色属性 血量 饱食度 精神值 mod 1-Combined Status(状态显示增加); 2-Minimap(小地图); 3-MOD,Global Positions(全球定位); 4-Health Info; 5-简易血条显示; 6-Geometric Placement(几何定位); …

LinuxC++项目开发日志——基于正倒排索引的boost搜索引擎(5——通过cpp-httplib库建立网页模块) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

前端做网站需要的技能wordpress文章关键词插件

Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特别全面。所以,自己对于这块小知识点进行了简单的总结。 简介 Arrays.asList()…

iSCSI网络存储——基于VM17下麒麟V10SP1与SP2的共享配置

iSCSI网络存储——基于VM17下麒麟V10SP1与SP2的共享配置本文适合零基础的Linux新手,通过详细的步骤和实际输出示例,教你如何在VMware虚拟机中搭建iSCSI网络存储环境。📖 教程前言 作为一名Linux新手,你是否曾经好…

微信二次开发文档

微信二次开发文档目前微信社群比较火,市面上社群管理工具也是有各式各样的,但是最终都不开微信的协议,协议样式也有很多,例如web、PC Hook、模拟机、Xposed等。但是目前各类协议的稳定性有待考究。 目前稳定不封号…

网站空间购买价格用ps怎么做学校网站页面

网页图表Highcharts实践教程之标签组与载入动画 Highcharts标签组 在图表的大部分元素都提供了标签功能。但很多时候,我们需要额外说明一些信息。这个时候借助原有的图表元素的标签功能就不是很方便。Highcharts为用户提供了标签组功能。使用该功能可以在图表区的任…

寺院网站建设用个人电脑做网站的步骤

mysql日志管理、备份与恢复 一、数据备份重要性数据备份类型二、数据库备份类型2.1物理备份1.冷备份(脱机备份):2.热备份(联机备份)∶3.温备份: 2.2逻辑备份1.完全备份2.差异备份3.增量备份 三、常见的备份方法3.1物理冷备3.2专用备份工具3.3启用二进制日志进行增量备份3.4第三…

CSP-S1 2025

邮寄J组没报(。) 中午吃饭不知道吃了什么神秘小零食,下午坐车的时候晕车比平常严重很多,而且恶心。最终还是没忍住,在车上进行了一个吐的催...(忏悔) 存疑食物:unk_菜叶子,那一年の_鱿鱼,隔夜の米饭,神秘海…

手机模板的网站哪个好网站建设中首页模板下载

1. 简述 我们使用OpenCV时,有时会在图像的某个位置绘制OSD信息,如绘制一些字符串作为指示信息。 本文将简要介绍在图像(cv::Mat)上绘制固定的字符串信息。 2. 使用的API (1)cv::getTextSize() CV_EXPORT…

北京正邦网站建设建设公司网站哪家好

8月31日,AUTOSEMO“恒以致远,共创共赢”主题研讨会在天津成功召开。本次大会由中国汽车工业协会软件分会中国汽车基础软件生态标委会(简称:AUTOSEMO)与天津市西青区人民政府联合主办。现场汇聚了100余位来自产学研政企…

金币

//题意:国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币; //之后两天(第二天和第三天)里,每天收到两枚金币;之后三天(第四、五、六天)里, //每天收到三枚金币;之后四天(第七、八、九、十天…

【阿里DeepResearch】写作组件WebWeaver详解 - 指南

【阿里DeepResearch】写作组件WebWeaver详解 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

常宁市住房和城乡建设局网站简洁大气公司网站

Apache Tomcat - Apache Tomcat 8 Software Downloadshttps://tomcat.apache.org/download-80.cgi2.找到Archives 3.选择下载的把版本 4.选择具体下载那个版本 5. 6.一般选择tar.gz结尾的压缩包

【远程桌面】运维强推设备之远程控制软件RustDesk 1.4.1 全面指南:开源远程桌面的终极解决方案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

完整教程:PostgreSQL 知识体系

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

加密货币技术革命:揭秘数字复兴时代

加密货币技术的史诗级演进 十年前,“加密货币”这个词对大多数人来说还十分陌生。而如今,几乎人人都听说过比特币、以太坊等加密货币。这种最初神秘的去中心化数字货币,现已发展成为包含DeFi平台、质押机会和NFT奇迹…