nodejs用ws模块反向代理socks5数据,即用ws写服务端和客户端及加密
首先思路是客户端发送socks5请求数据——>服务端解密并解析socks5数据是否为真,解析出Host和port,并用net.socket访问目标网站,目标网站返回数据,服务端再用ws发送返回数据给客户端
//解析socks5数据和返回socks5格式响应
//在读下面代码时希望你了解socks5的格式
+----+-----+-------+------+----------+----------+----------+
|0x05|0x01 | 0x00 | 0x03 | 0x09 | baidu.com| 0x00 0x50 |
+----+-----+-------+------+----------+----------+----------+
下面共7个字节+域名字节长度
偏移量 长度 描述
0 1 版本号 (0x05)
1 1 命令 (0x01: CONNECT)
2 1 保留字段 (0x00)
3 1 地址类型 (0x03: 域名)
4 1 域名长度 (1 字节)
5 可变 域名 (根据长度)
5 + 域名长度 2 端口号 (2 字节)
SOCKS5 请求示例
假设客户端请求连接到 baidu.com:80,SOCKS5 请求的格式如下:
字段 值 说明
版本号 0x05 SOCKS5 版本号。
命令 0x01 CONNECT 命令。
保留字段 0x00 保留字段,必须为 0x00。
地址类型 0x03 DOMAINNAME 地址类型。
域名长度 0x09 域名长度为 9 字节。
域名 baidu.com 目标域名。
端口号 0x0050 目标端口号(80)
。
SOCKS5 响应示例
+----+-----+-------+------+----------+----------+----------+
|0x05| rep | 0x00 | 0x01 | 0x00 0x00 0x00 0x00 | 0x00 0x00 |
+----+-----+-------+------+----------+----------+----------+
假设请求成功,SOCKS5 响应的格式如下:
字段 值 说明
版本号 0x05 SOCKS5 版本号。
响应码 0x00 SUCCEEDED,请求成功。
保留字段 0x00 保留字段,必须为 0x00。
地址类型 0x01 IP_V4_ADDR 地址类型。
绑定地址 0x00000000 绑定地址(通常为 0.0.0.0)。
绑定端口 0x0000 绑定端口(通常为 0)。
//socks.js代码
'use strict';const util=require('util');
//socks5的版本号永远是0x05,即5;
const VERSION=5;
//SOCKS5 支持多种认证方法,客户端和服务端在握手阶段协商使用哪种认证方法。
const AUTH={NO_AUTH: 0, //不需要认证。GSSAPI: 1, //使用 GSSAPI(通用安全服务应用程序接口)进行认证。USERNAME_PASSWD: 2, //使用用户名和密码进行认证。IANA_ASSIGNED: 3, // 0x03 to 0x7f IANA 分配的认证方法RESERVED: 0x80, // 0x80 to 0xfe 保留的认证方法(0x80 到 0xFE)NO_ACCEPTABLE_METHODS: 0xff //没有可接受的认证方法
};
//SOCKS5 客户端可以发送以下命令,指示代理服务器执行的操作
const CMD={CONNECT:1, //建立 TCP 连接。通常用于 HTTP、HTTPS 等协议BIND:2, //绑定端口。通常用于 FTP 等需要反向连接的协议。UDP_ASSOCIATE:3 //建立 UDP 关联。用于 UDP 协议(如 DNS、QUIC)
};
//SOCKS5 支持多种目标地址类型
const ATYP={IP_V4_ADDR:1, //ip4DOMAINNAME:3, //域名IP_V6_ADDR:4 //ip6
};//SOCKS5 服务器在处理客户端请求后,会返回一个响应码,表示请求的处理结果。
const REP={SUCCEEDED:0, //请求成功。SOCKS_SERV_FAILURE:1, //SOCKS 服务器故障。CONN_NOT_ALLOWED:2, //连接不被允许(例如,目标地址被禁止)NETWORK_UNREACHABLE: 3, //网络不可达HOST_UNREACHABLE: 4, //主机不可达CONN_REFUSED: 5, //连接被拒绝TTL_EXPIRED: 6, //TTL(生存时间)已过期CMD_NOT_SURPPORTED: 7, //命令不支持ATYP_NOT_SUPPORTED: 8 //地址类型不支持
};//解析客户端发送过来的网址请求,是socks5格式的请求
//最后最到host和port,并检查host是域名|ip_V4|ip_V6
function parseRequest(data)
{let host,port;if(data.length<8){return {ok:false};}let buf=Buffer.from(data);let ver=buf.readUInt8(0);let cmd=buf.readUInt8(1);if(ver !=VERSION || cmd != CMD.CONNECT){return{ok:false};//return {ok:false,msg:generateReply(REP.CMD_NOT_SURPPORTED)};}let atyp=buf.readUInt8(3);switch(atyp){case ATYP.DOMAINNAME:let alen=buf.readUInt8(4);host=buf.toString('utf8',5,5+alen);port=buf.readUInt16BE(5+alen);break;case ATYP.IP_V4_ADDR:if(data.length<10){return {ok:false,msg:generateReply(REP.CONN_NOT_ALLOWED)};} host=util.format('%d.%d.%d.%d',buf[4],buf[5],buf[6],buf[7]);port=buf.readUInt16BE(8);break;case ATYP.IP_V6_ADDR:if(data.length<22){return {ok:false,msg:generateReply(REP.CONN_NOT_ALLOWED)}} host=util.format('%s:%s:%s:%s:%s:%s:%s:%s', buf.toString('hex',4,6), buf.toString('hex',6,8), buf.toString('hex',8,10), buf.toString('hex',10,12), buf.toString('hex',12,14), buf.toString('hex',14,16), buf.toString('hex',16,18), buf.toString('hex',18,20));port=buf.readUInt16BE(20);break;default:return {ok:false,msg:generateReply(REP.ATYP_NOT_SUPPORTED)}; }return {ok:true,host:host,port:port};
}//返回一个socks5响应,10个字节,可看上面的响应格式
function generateReply(rep=REP.SUCCEEDED)
{var rep=Buffer.alloc(10);rep.writeUInt8(VERSION);rep.writeUInt8(rep,1);rep.writeUInt8(ATYP.IP_V4_ADDR,3);return rep;
}function parseNegotiation(data)
{if(data.length<3){return {ok:false};}let arr=Buffer.from(data);let ver=arr.readUInt8(0);let n=arr.readUInt8(1);let method=arr.readUInt8(2);if(ver != VERSION || n <1 || method!=AUTH.NO_AUTH){return {ok:false,msg:Buffer.from([VERSION,AUTH.NO_ACCEPTABLE_METHODS])};}return {ok:true,msg:Buffer.from([VERSION,AUTH.NO_AUTH])};
}module.exports={parseNegotiation:parseNegotiation,generateReply:generateReply,parseRequest:parseRequest
};
//服务端代码
'use strict';
const net=require('net');
const dns=require('dns');
const util=require("util");
const WebSocket=require('ws');
const Cipher=require('./cipher');
const socks=require("./socks");const TIMEOUT=60000;
const TIMEWAIT=10000;class Server{constructor(options){this.key=options.key;this.host=options.host;this.port=options.port;//创建ws服务端this.server=new WebSocket.Server({host:options.host,port:options.port});this.server.on('error',err=>{console.log(err.toString());});this.server.on('close',()=>{console.log('server close');this.server.clients.forEach(function each(client){if(client && client.readyState===WebSocket.OPEN){client.destroy();}});}); }//运行服务端run(){const key=this.key;const port=this.port;this.server.on('connection',(ws,req)=>{//连接到服务端的ip和端口,就是用户的IP和端口const peer=req.socket.remoteAddress+":"+req.socket.remotePort;console.log('%s -- :%d $ connected',peer,port);//创建加密let cipher=new Cipher(key);//接收到客户端发送过来的请求ws.on('message',msg=>{console.log('%s -> [%d] :%d',peer,msg.length,this.port);let raw;try{//解密请求信息raw=cipher.decrypt(msg);console.log(raw);}catch(e){console.log(e.toString());setTimeout(()=>ws.close(),Math.random()+TIMEOUT);return;}//解析SOCKS5请求let res=socks.parseRequest(raw);if(!res.ok){console.log('Invalid socks5 request');ws.close();return;}//解析出客户端请求中的host和端口,就是你要访问的网站的域名和端口const {host,port}=res;//与目标服务器建立连接,就是你请求域名的目标服务器const targetSocket=new net.Socket();//和目标服务器建立连接,也就是你要的访问网站建立连接targetSocket.connect(port,host,()=>{console.log('Connected to target server:',host,port);//返回SOCKS5成功响应,这里要先给客户端返回一个socks5格式数据表示已经和目标网站建立连接const response=socks.generateReply();ws.send(response);//这里收到了客户端返回的数据//也就是这段httpRequest='GET / HTTP/1.1\r\nHost: baidu.com\r\nConnection: close\r\n\r\n';//让targatSocket把这个请求头发给百度的服务器ws.on('message',(data)=>{console.log('这里是转发数据:',data.toString());//这里发给你请求的网站的服务器,如现在请求的百度targetSocket.write(data);});//这里是百度服务器返回的数据targetSocket.on('data',data=>{console.log('这接收到targetSocket过来的数据:',data);//然后转发给我们的客户端ws.send(data);});});targetSocket.on('error',err=>{console.log('Target server connection error:',err);ws.close();});targetSocket.on('close',()=>{console.log('Target server connection close:',close);ws.close();})})ws.on('close',()=>{console.log('%s -- disconnected.',peer);});ws.on('error',err=>{console.error('WebSocket error: ',err);});})}}const options={key:"metadata",host:'localhost',port:8000
};let s=new Server(options);
s.run();
//接着是客户端
const WebSocket=require('ws');
const Cipher=require("./cipher");//SOCKS5协议常量
const VERSION=0x05; //socks5版本号
const CMD={CONNECT:0x01, //CONNECT命令
};
const ATYP={DOMAINNAME:0x03, //域名
};//目录服务器信息
const TARGET_HOST='www.baidu.com'; //目标主机
const TARGET_PORT=80; //目标端口//创建SOCKS5请求
//这里是硬创建的数据写入内存中,现实中应该用上面的协议常量
function createSocks5Request(host, port) {const hostLength = Buffer.byteLength(host);const buffer = Buffer.alloc(7 + hostLength);// 写入版本号buffer.writeUInt8(0x05, 0); // 版本号必须是 0x05// 写入命令 (CONNECT)buffer.writeUInt8(0x01, 1); // 命令必须是 0x01 (CONNECT)// 写入保留字段buffer.writeUInt8(0x00, 2); // 保留字段必须是 0x00// 写入地址类型 (域名)buffer.writeUInt8(0x03, 3); // 地址类型必须是 0x03 (域名)// 写入域名长度buffer.writeUInt8(hostLength, 4); // 域名长度// 写入域名buffer.write(host, 5); // 域名// 写入端口号buffer.writeUInt16BE(port, 5 + hostLength); // 端口号return buffer;
}//连接到服务器
const ws=new WebSocket('ws://localhost:8000');
//加密认证
const cipher=new Cipher("metadata");
ws.on('open',()=>{console.log('Connected to WebSocket server');//发送SOCKS5请求const request=createSocks5Request(TARGET_HOST,TARGET_PORT);ws.send(cipher.encrypt(request));
});ws.on('message',data=>{//console.log('接收来自服务端数据:',data.toString());//如果SOCKS5响应,发送HTTP请求//SOCKS5响应为10字节,因为在socks.js中的generateReply()生成的就是10个字节if(data.length===10){const httpRequest='GET / HTTP/1.1\r\nHost: baidu.com\r\nConnection: close\r\n\r\n';ws.send(httpRequest);}else{//打印目标服务器返回的数据,这里返回的就是网站数据即html格式的数据 console.log('Respnonse from target server: ',data.toString());}
});ws.on('close',()=>{console.log('Connection closed');
});
ws.on('error',(err)=>{console.error('WebSocket error: ',err);
});
实现客户端与目标服务器之间的双向数据转发。
这里没有贴出加密的代码,这个不难你们可以自己现实一个加密即可,也可以不加密,只是测试用
- 数据转发的工作流程
客户端发送数据:
客户端通过 WebSocket 发送数据(如 HTTP 请求)。
ws.on(‘message’, …) 捕获数据,并通过 targetSocket.write(data) 将数据转发给目标服务器。
目标服务器返回数据:
目标服务器处理请求后,返回数据(如 HTTP 响应)。
targetSocket.on(‘data’, …) 捕获数据,并通过 ws.send(data) 将数据转发给客户端。
双向通信:
通过这两个事件监听器,客户端与目标服务器之间的通信可以实现双向转发。
- 示例场景
假设客户端通过 SOCKS5 代理访问 baidu.com:
客户端发送 SOCKS5 请求:
客户端发送 SOCKS5 请求到代理服务器,请求连接到 baidu.com:80。
代理服务器建立连接:
代理服务器解析 SOCKS5 请求,并与 baidu.com:80 建立 TCP 连接。
代理服务器返回 SOCKS5 响应:
代理服务器生成 SOCKS5 响应(response),并通过 ws.send(response) 发送给客户端。
客户端发送 HTTP 请求:
客户端发送 HTTP 请求(如 GET / HTTP/1.1)到代理服务器。
代理服务器通过 ws.on(‘message’, …) 捕获请求,并通过 targetSocket.write(data) 将请求转发给 baidu.com。
目标服务器返回 HTTP 响应:
baidu.com 返回 HTTP 响应。
代理服务器通过 targetSocket.on(‘data’, …) 捕获响应,并通过 ws.send(data) 将响应转发给客户端。
- 总结
const response = socks.generateReply();:生成 SOCKS5 响应,表示连接成功。
ws.send(response);:将 SOCKS5 响应发送给客户端。
数据转发部分:
ws.on(‘message’, …):将客户端的数据转发给目标服务器。
targetSocket.on(‘data’, …):将目标服务器的数据转发给客户端。
相关文章:
nodejs用ws模块反向代理socks5数据,即用ws写服务端和客户端及加密
首先思路是客户端发送socks5请求数据——>服务端解密并解析socks5数据是否为真,解析出Host和port,并用net.socket访问目标网站,目标网站返回数据,服务端再用ws发送返回数据给客户端 //解析socks5数据和返回socks5格式响应 //在读下面代码…...
【MySQL篇】数据库基础
目录 1,什么是数据库? 2,主流数据库 3,MySQL介绍 1,MySQL架构 2,SQL分类 3,MySQL存储引擎 1,什么是数据库? 数据库(Database,简称DB…...
linux后台运行程序怎么停止
启动 nohup ./jmeter -nt test.jmx 查看 ps -ef | grep nohup或者 ps -ef | grep test 停止 kill 掉上面查询出的进程 疑惑 停止掉java进程或者jmeter进程,但是没有实际停止任务,所以用nohup查出来进程再停止比较靠谱!!...
华为认证考试证书下载步骤(纸质+电子版)
华为考试证书可以通过官方渠道下载相应的电子证书,部分高级认证如HCIE还支持申请纸质证书。 一、华为电子版证书申请步骤如下: ①访问华为培训与认证网站 打开浏览器,登录华为培训与认证官方网站 ②登录个人账号 在网站首页,点…...
scala基础
Scala基础 scala基础Scala介绍第一个scala代码object和class的区别关键区别伴生类和伴生对象: 字节码解析在java中创建三个类 反编译代码编译User.class源码后的结果编译Emp.class源码后的结果 注释Scala类型推断&至简原则变量var和val之间的区别可变变量不可变…...
Linux中的查看命令
路径分为相对路径(行相对当前工作目录开始的路径)和绝对路径(不管是)#:命令提示符,从这个位置可以开始输入命令,另一个提示符为$,如果是root,则提示为#;如果是…...
深入了解 NAT 模式:网络地址转换的奥秘
深入了解 NAT 模式:网络地址转换的奥秘 在计算机网络的世界里,NAT 模式(Network Address Translation,网络地址转换)扮演着至关重要的角色。它就像是网络中的翻译官,在不同网络地址之间进行转换࿰…...
HTML第二节
一.列表 1.列表的简介 2.无序列表 注:1.ul里面只能放li,不能放标题和段落标签 2.li里面可以放标题和段落等内容 3.有序列表 4.定义列表 注:要实现上图的效果需要CSS 二.表格 1.表格介绍 注:1.th有额外的效果,可以…...
203、【数组】NLP分词实现(Python)
题目描述 给定一个词典,比如[“杭州”,“西湖”,“博物馆”,“杭州西湖博物馆”,“我”] 对于输入的文本进分词:我在杭州的杭州西湖博物馆玩了一天 分词结果处理为如下形式的字符串: 我\W 在 杭州\W 的 杭州西湖博物馆\W 玩了一天 对于输入的文本…...
Qt 开源音视频框架模块之QtAV播放器实践
Qt 开源音视频框架模块QtAV播放器实践 1 摘要 QtAV是一个基于Qt的多媒体框架,旨在简化音视频播放和处理。它是一个跨平台的库,支持多种音视频格式,并提供了一个简单易用的API来集成音视频功能。QtAV的设计目标是为Qt应用程序提供强大的音视…...
在虚拟机CentOS安装VMware Tools
在虚拟机 CentOS 中安装 VMware Tools 可以增强虚拟机与宿主机之间的交互,例如实现文件共享、屏幕自适应等功能。以下是详细的安装步骤: 1.前提条件 已安装 VMware Workstation 或 VMware Fusion 等虚拟机软件。已在虚拟机中安装 CentOS 操作系统。 2…...
LeetCode热题100- 字符串解码【JavaScript讲解】
古语有云:“事以密成,语以泄败”! 关于字符串解码: 题目:题解:js代码:代码中遇到的方法:repeat方法:为什么这里不用this.strstack.push(result)? 题目&#x…...
验证码介绍及生成与验证(HTML + JavaScript实现)
验证码介绍及生成与验证(HTML JavaScript实现) 验证码 验证码(全自动区分计算机和人类的图灵测试,CAPTCHA ,Completely Automated Public Turing test to tell Computers and Humans A…...
【深入探索 Caffeine:Java 缓存利器】
引言 咱搞软件开发的时候,缓存可是提升系统性能的关键。用好了缓存,能大大减少对数据库、远程服务这些后端数据源的访问,系统响应更快,吞吐量也能提高。Java 里有不少不错的缓存框架,不过 Caffeine 性能好、功能多&am…...
Spring Boot启动过程?
目录 1. 启动入口 2. SpringApplication 初始化 3. 准备环境 4. 创建应用上下文(ApplicationContext) 5. 准备应用上下文 6. 刷新应用上下文 7. 启动 Web 服务器(若为 Web 应用) 8. 发布 ApplicationStartedEvent 事件 9. 执行 Runner 10. 发布 ApplicationReady…...
数字可调控开关电源设计(论文+源码)
1 设计要求 在本次数字可调控开关电源设计过程中,对关键参数设定如下: (1)输入电压:DC24-26V,输出电压:12-24(可调); (2)输出电压误差…...
驭势科技9周年:怀揣理想,踏浪前行
2025年的2月,驭势科技迎来9岁生日。位于国内外不同工作地的Uiseeker齐聚线上线下,共同庆祝驭势走过的璀璨九年。 驭势科技联合创始人、董事长兼CEO吴甘沙现场分享了驭势9年的奔赴之路,每一段故事都包含着坚持与拼搏。 左右滑动查看更多 Part.…...
Linux系统之DHCP网络协议
目录 一、DHCP概述 二、DHCP部署实操 2.1、安装DHCP软件 2.2、拷贝配置文件 2.3、配置文件详解 2.4、重启软件服务 2.5、新开一台服务器,查看dhcp地址获取 一、DHCP概述 DHCP(Dynamic Host Configuration Protocol)是一种应用层网络协…...
游戏引擎学习第120天
仓库:https://gitee.com/mrxiao_com/2d_game_3 上次回顾:周期计数代码 我们正在进行一个项目的代码优化工作,目标是提高性能。当前正在优化某个特定的代码片段,已经将其执行周期减少到48个周期。为了实现这一目标,我们设计了一个…...
爬虫抓取数据时如何处理异常?
在爬虫开发中,处理异常是确保爬虫稳定运行的关键环节。爬虫在运行过程中可能会遇到各种问题,例如网络请求失败、目标页面结构变化、数据缺失等。合理处理这些异常可以提高爬虫的鲁棒性,避免因小问题导致整个爬虫程序崩溃。以下是一些常见的异…...
【DeepSeek探索篇(四)】高效学习与工作,从搭建DeepSeek个人知识库开始!
高效学习与工作,从搭建DeepSeek个人知识库开始! 打工人和学习者必看!你为何急需一个个人知识库?搭建个人知识库需要用到哪些技术呢?一、模型微调与RAG技术简介二、RAG技术原理剖析 揭秘Embedding:为何它是D…...
游戏引擎学习第125天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾并为今天的内容做准备。 昨天,当我们离开时,工作队列已经完成了基本的功能。这个队列虽然简单,但它能够执行任务,并且我们已经为各种操作编写了测试。字符串也能够正常推送到队…...
【大模型系列篇】大模型微调工具 LLama-Factory、Unsloth、ms-SWIFT
今日号外:🔥🔥🔥 DeepSeek团队正式启动为期五天的开源计划 Day3:DeepGEMM。DeepGEMM 是一个专为简洁高效的 FP8 通用矩阵乘法(GEMM)设计的库,具有细粒度缩放功能,如 Deep…...
Zabbix问题记录2--踩坑HttpRequest,header添加无效
背景 在试图尝试通过Zabbix接入DeepSeek API的时候,由于使用了HTTP的方式,所以需要使用Zabbix 自带的HttpRequest库进行请求,产生了下面的问题 问题 curl curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completio…...
DINOv2 + yolov8 + opencv 检测卡车的可拉拽雨覆是否完全覆盖
最近是接了一个需求咨询图像处理类的,甲方要在卡车过磅的地方装一个摄像头用检测卡车的车斗雨覆是否完全, 让我大致理了下需求并对技术核心做下预研究 开发一套图像处理软件,能够实时监控经过的卡车并判断其车斗的雨覆状态。 系统需具备以下…...
【嵌入式】RTOS安装和测试
RTOS 安装 安装RTOS,可采用RT-Linux框架 [RT-Linux — 快速使用手册](2. RT-Linux — 快速使用手册—基于LubanCat-RK356x系列板卡 文档),apt没有安装包,更新ubuntu系统版本后仍然不行,后更新国内软件源仍然没有检测到安装包。后…...
MySQL的存储引擎
存储引擎的概念 存储引擎:负责将数据存储在物理存储设备(如磁盘)上的结构和机制。存储引擎决定了数据库如何管理、组织和访问数据。) 因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型…...
瑞芯微RK安卓Android主板GPIO按键配置方法,触觉智能嵌入式开发
触觉智能分享,瑞芯微RK安卓Android主板GPIO按键配置方法,方便大家更好利用空闲IO!由触觉智能Purple Pi OH鸿蒙开发板演示,搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持安卓Android、开源鸿蒙Open…...
数据安全_笔记系列09_人工智能(AI)与机器学习(ML)在数据安全中的深度应用
数据安全_笔记系列09_人工智能(AI)与机器学习(ML)在数据安全中的深度应用 人工智能与机器学习技术通过自动化、智能化的数据分析,显著提升了数据分类、威胁检测的精度与效率,尤其在处理非结构化数据、复杂…...
跨平台公式兼容性大模型提示词模板(飞书 + CSDN + Microsoft Word)
飞书云文档 CSDN MD编辑器 Microsoft Word 跨平台公式兼容方案: 一、背景痛点与解决方案 在技术文档创作中,数学公式的跨平台渲染一直存在三大痛点: 飞书云文档:原生KaTeX渲染与导出功能存在语法限制微软Word:Math…...
Redis面试题----Redis 的持久化机制是什么?各自的优缺点?
Redis 提供了两种主要的持久化机制,分别是 RDB(Redis Database)和 AOF(Append Only File),下面将详细介绍它们的原理、优缺点。 RDB(Redis Database) 原理 RDB 持久化是将 Redis 在某个时间点上的数据集快照以二进制文件的形式保存到磁盘上。可以通过手动执行 SAVE …...
Leetcode-接雨水(单调栈)
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] …...
[ComfyUI]官方已支持Skyreels混元图生视频,速度更快,效果更好(附工作流)
一、介绍 昨天有提到官方已经支持了Skyreels,皆大欢喜,效果更好一些,还有GGUF量化版本,进一步降低了大家的显存消耗。 今天就来分享一下官方流怎么搭建,我体验下来感觉更稳了一些,生成速度也更快…...
安宝特方案 | 电力行业的“智能之眼”,AR重新定义高效运维!
引言: 电力行业正经历智能化变革,安宝特AR数字化工作流以四大核心优势,为电力企业打造全场景智慧运维方案! 四大颠覆性功能,直击行业痛点 1、高度自定义作业流程 支持图文指引、语音播报、AI实时识别(如…...
游戏引擎学习第124天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾/复习 今天是继续完善和调试多线程的任务队列。之前的几天,我们已经介绍了多线程的一些基础知识,包括如何创建工作队列以及如何在线程中处理任务。今天,重点是解决那些我们之前没有注意到…...
微软推出Office免费版,限制诸多,只能编辑不能保存到本地
易采游戏网2月25日独家消息:微软宣布推出一款免费的Office版本,允许用户进行基础文档编辑操作,但限制颇多,其中最引人关注的是用户无法将文件保存到本地。这一举措引发了广泛讨论,业界人士对其背后的商业策略和用户体验…...
spring中的注解介绍
本篇文章专门用来介绍spring中的各种注解。 1、RestController 1、含义 2、举例 3、使用场景 RestController 通常用于开发 RESTful API,适合返回 JSON 或 XML 数据的场景 4、总结 RestController 是 Spring 中用于简化 RESTful Web 服务开发的注解,它结…...
修改`FSL Yocto Project Community BSP`用到的u-boot源码,使其能适配百问网(100ask)的开发板
前言 在博文 https://blog.csdn.net/wenhao_ir/article/details/145547974 中,我们利用官方提供的BSP(FSL Yocto Project Community BSP)构建了写到SD卡中的完整镜像,然后启动后发现存在不少问题,首要的问题就是u-boot不能识别网卡,在这篇博文中,我们就找到FSL Yocto Pro…...
DeepSeek开源周Day2:DeepEP - 专为 MoE 模型设计的超高效 GPU 通信库
项目地址:https://github.com/deepseek-ai/DeepEP 开源日历:2025-02-24起 每日9AM(北京时间)更新,持续五天 (2/5)! 引言 在大模型训练中,混合专家模型(Mixture-of-Experts, MoE)因其动…...
计算机毕业设计 ——jspssm506Springboot 的旧物置换网站
作者:程序媛9688 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等。 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题)…...
观成科技:海莲花“PerfSpyRAT”木马加密通信分析
1.概述 在2024年9月中旬至10月,东南亚APT组织“海莲花”通过GitHub发布开源安全工具项目,针对网络安全人员发起了定向攻击。通过对相关攻击活动进行分析,可以将其与一些海莲花的样本关联起来。这些样本的通信数据结构与海莲花此前使用的攻击…...
在使用 npm link 进行本地 npm 包调试时,是否需要删除项目中已安装的依赖包取决于你的调试场景和依赖管理方式
1. 默认情况下不需要删除已安装的包 npm link 的工作原理: 当你在项目中运行 npm link <package-name> 时,npm 会创建一个符号链接(symlink),将项目的 node_modules/<package-name> 指向全局的软链包&am…...
Springboot快速接入豆包大模型
背景 突然接到上面的通知,想要在系统里面接入各大模型的能力,我这边随机选了个豆包,然后快速对接了一下,很顺利,一把过,现在文档的快速入门还是很ok的,在此记录一下过程,给宝子们参考…...
w803|联盛德|WM IoT SDK2.X测试|window11|TOML 文件|外设|TFT_LCD|测试任务|(5):TFT_LCD_LVGL示例
TFT_LCD_LVGL 功能概述 此应用程序是使用 WM IoT SDK 进行 LVGL 功能的示例。它演示了如何初始化 TFT LCD 设备,并创建 LVGL DEMO Task 进行 LVGL 模块的初始化,并展示 LVGL 原生的不同 Demo 场景, 例如: Widgets, Music Player, Benchmark…...
java23种设计模式-观察者模式
观察者模式(Observer Pattern)学习笔记 编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793 DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/details/145884039 1.…...
【MySQL 一 数据库基础】深入解析 MySQL 的索引(3)
索引 索引操作 自动创建 当我们为一张表加主键约束(Primary key),外键约束(Foreign Key),唯一约束(Unique)时,MySQL会为对应的的列自动创建一个索引;如果表不指定任何约束时,MySQL会自动为每一列生成一个索引并用ROW_I…...
本地部署 deepseek-r1 1.5B方法-ubuntu20.04 python3.10 pycharm虚拟环境
1. 环境安装 ubuntu20.04 python3.10 pycharm虚拟环境 2.拉取代码 虚拟环境下安装vllm: pip install vllm ubuntu命令窗口安装 sudo apt install git-lfs 初始化 Git LFS 安装 Git LFS 后,你需要虚拟环境命令窗口初始化它:git lfs i…...
【Qt】为程序增加闪退crash报告日志
背景 随着软件代码量的增加,软件崩溃闪退的肯能行越来越大,其中一些是难以复现的,比如访问了访问了非法地址、被操作系统杀死等。 为此,在软件出现闪退情况时,尽可能多的记录闪退发生时信息,对排查闪退原…...
Visual Studio打开文件后,中文变乱码的解决方案
文件加载 使用Unicode(UTF-8)编码加载文件 C:\WorkSpace\Assets\Scripts\UI\View\ExecuteComplateView.cs时,有些字节已用Unicode替换字符替换。保存该文件将不会保留原始文件内容。...
某住宅小区地下车库安科瑞的新能源汽车充电桩的配电设计与应用方案 安科瑞 耿笠
摘要:纯电动商用车的工作环境存在路况复杂、工况恶劣等情况,导致整车电气设备的磨损速率加快,造成电气设备绝缘电阻持续下降,如不及时处理,可能存在安全隐患或引发重大安全事故。文章从绝缘故障检测原理出发࿰…...