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

【iOS逆向与安全】好用的一套 TCP 类

 初始化

//页面
%hook xxxxxxxViewController//- (void)viewWillAppear:(BOOL)animated{
//NSLog(@"View Will Appear,再次进入刷新");
- (void)viewDidLoad{//启动tcp[[Xddtcp sharedTcpManager] connectServer] ;}

 发送数据

//发送数据 [[Xddtcp sharedTcpManager] sendDataToServer:[@"MyiPhone" dataUsingEncoding:NSUTF8StringEncoding]] ;

源码类

//
//  Xddtcp.m
//  YFX_ScoketForClientDemo
//
//  Created by adminxdd on 2020/8/20.
//  Copyright © 2020 fangxue. All rights reserved.
//#import "Xddtcp.h"#define WSELF __weak typeof(self) wself = self;/** 主线程异步队列 */
#define Dispatch_main_async_safe(block)\
if ([NSThread isMainThread]) {\
block();\
} else {\
dispatch_async(dispatch_get_main_queue(), block);\
}//@implementation Xddtcp
@interface Xddtcp() <GCDAsyncSocketDelegate>/** 心跳计时器 */
@property (nonatomic, strong) NSTimer *heartBeatTimer;/** 没有网络的时候检测网络定时器 */
@property(nonatomic,strong)NSTimer*netWorkTestingTimer;/** 存储要发送给服务端的数据 */
@property (nonatomic, strong) NSMutableArray *sendDataArray;/** 数据请求队列(串行队列) */
@property (nonatomic, strong) dispatch_queue_t queue;/** 重连时间 */
@property (nonatomic, assign) NSTimeInterval reConnectTime;/** 用于判断是否主动关闭长连接,如果是主动断开连接,连接失败的代理中,就不用执行 重新连接方法 */
@property (nonatomic, assign) BOOL isActivelyClose;/** 缓存区域 */
@property (nonatomic, strong) NSMutableData *readBuf;@end@implementation Xddtcp#pragma mark - 🔥🔥🔥🔥🔥🔥🔥🔥
#pragma mark ----单利------/** 单利 */
+ (instancetype)sharedTcpManager{static Xddtcp*_instace =nil;static dispatch_once_t onceToken;dispatch_once(&onceToken,^{_instace = [[self alloc]init];NSLog(@"TCP 单利实例化!");});return _instace;
}
#pragma mark ----初始化------/** 初始化 */
- (instancetype)init{self= [super init];if(self){self.reConnectTime = 0;self.isActivelyClose = NO;self.queue = dispatch_queue_create("BF",NULL);self.sendDataArray = [[NSMutableArray alloc] init];//        self.mRecvPacket = [JHreceivePacket sharedManager];//        self.deviceListArr = [[NSMutableArray alloc] init];//        DLogInfo(@"初始化!");}return self;
}#pragma mark - 🔥🔥🔥🔥🔥🔥🔥🔥#pragma mark --- 心跳计时器处理 -----/** 心跳计时器初始化 */
- (void)initHeartBeat{//心跳没有被关闭if(self.heartBeatTimer){return;}[self destoryHeartBeat];//连接成功  先发一次 心跳数据 在打开计时器//[[JHSocketData sharedManager] heartbeat];//判断是否打开if([xddTools keyGet:@"isOpenTCP"]&&[[xddTools keyGet:@"isOpenTCP"] isEqualToString:@"已打开"]){[self.asyncTcpSocket writeData:[@"MyiPhone" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:30 tag:0];}WSELFDispatch_main_async_safe(^{wself.heartBeatTimer  = [NSTimer timerWithTimeInterval:30 target:wself selector:@selector(senderheartBeat) userInfo:nil repeats:true];[[NSRunLoop currentRunLoop]addTimer:wself.heartBeatTimer forMode:NSRunLoopCommonModes];});}#pragma mark --- 取消心跳 -----/** 取消心跳 */
- (void)destoryHeartBeat
{WSELFDispatch_main_async_safe(^{if(wself.heartBeatTimer){[wself.heartBeatTimer invalidate];wself.heartBeatTimer =nil;}});
}#pragma mark --- 没有网络的时候开始定时 -- 用于网络检测 -----/** 没有网络,进行网络监测 */
- (void)noNetWorkStartTestingTimer{WSELFDispatch_main_async_safe(^{wself.netWorkTestingTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:wself selector:@selector(noNetWorkStartTesting) userInfo:nil repeats:YES];[[NSRunLoop currentRunLoop] addTimer:wself.netWorkTestingTimer forMode:NSDefaultRunLoopMode];});
}#pragma mark --- 取消网络监测 ----/** 取消网络监测 */
- (void)destoryNetWorkStartTesting
{WSELFDispatch_main_async_safe(^{if(wself.netWorkTestingTimer){[wself.netWorkTestingTimer invalidate];wself.netWorkTestingTimer =nil;}});
}#pragma mark - 🔥🔥🔥🔥🔥🔥🔥🔥#pragma mark --- 发送心跳 ---/** 发送心跳 */
- (void)senderheartBeat{//  和服务端约定好发送什么作为心跳标识,尽可能的减小心跳包大小[self.asyncTcpSocket writeData:[@"ok" dataUsingEncoding:NSUTF8StringEncoding] withTimeout:30 tag:0];//    WSELF;//    Dispatch_main_async_safe(^{////    });
}#pragma mark --- 定时检查网络 ---/** 定时检查网络 */
- (void)noNetWorkStartTesting{//有网络if(AFNetworkReachabilityManager.sharedManager.networkReachabilityStatus != AFNetworkReachabilityStatusNotReachable){//关闭网络检测定时器[self destoryNetWorkStartTesting];//开始重连[self reConnectServer];}}
#pragma mark - 🔥🔥🔥🔥🔥🔥🔥🔥#pragma mark ----建立连接------/**  建立连接 */-(void)connectServer{self.isActivelyClose = NO;NSError*error =nil;_asyncTcpSocket= [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];NSString* ip       = [xddTools keyGet:@"TCP_IP"];NSString* port_str = [xddTools keyGet:@"TCP_Port"];if([ip isEqualToString:@""]){ip = @"192.168.1.2";[xddTools keySet:@"TCP_IP" v:ip];}if([port_str isEqualToString:@""]){port_str = @"12485";[xddTools keySet:@"TCP_Port" v:port_str];}UInt16 port = [port_str integerValue];//你的ip地址和端口号[_asyncTcpSocket connectToHost:ip onPort:port withTimeout:60 error:&error];if(error) {NSLog(@"TCP连接错误:%@", error);}[self.asyncTcpSocket readDataWithTimeout:-1 tag:0];}#pragma mark --- 重连服务器 ---/** 重连服务器 */
- (void)reConnectServer{if (self.asyncTcpSocket.isConnected) {return;}if (self.reConnectTime > 10240) {self.reConnectTime = 0;return;}WSELF;dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.reConnectTime *NSEC_PER_SEC)), dispatch_get_main_queue(), ^{if(wself.asyncTcpSocket.isConnected){return;}[wself connectServer];NSLog(@"正在重连%f",wself.reConnectTime);if(wself.reConnectTime==0){ //重连时间2的指数级增长wself.reConnectTime=2;} else {wself.reConnectTime*=2;}});NSLog(@"重连服务器!");}#pragma mark ----关闭连接------
/** 关闭连接 */
- (void)disConnectServer {NSLog(@"dealloc");// 关闭套接字self.isActivelyClose = YES;[self.asyncTcpSocket disconnect];//关闭心跳定时器[self destoryHeartBeat];//关闭网络检测定时器[self destoryNetWorkStartTesting];self.asyncTcpSocket = nil;
}#pragma mark ---代理 连接成功 ---
//连接成功
-(void)socket:(GCDAsyncSocket*)sock didConnectToHost:(NSString*)host port:(uint16_t)port
{NSLog(@"TCP连接成功!");//    [self.asyncTcpSocket readDataWithTimeout:-1 tag:index];//      [self.asyncTcpSocket readDataWithTimeout:-1 tag:0];// 存储接收数据的缓存区,处理数据的粘包和断包self.readBuf = [[NSMutableData alloc]init];[self initHeartBeat]; //开启心跳//如果有尚未发送的数据,继续向服务端发送数据if([self.sendDataArray count] >0){[self sendeDataToServer];}
}#pragma mark ---代理 连接失败 ---
//连接失败 进行重连操作
-(void)socketDidDisconnect:(GCDAsyncSocket*)sock withError:(NSError*)err{//用户主动断开连接,就不去进行重连if(self.isActivelyClose){return;}[self destoryHeartBeat]; //断开连接时销毁心跳//判断网络环境if (AFNetworkReachabilityManager.sharedManager.networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) //没有网络{[self noNetWorkStartTestingTimer];//开启网络检测定时器}else//有网络{[self reConnectServer];//连接失败就重连}NSLog(@"TCP连接失败!");
}#pragma mark --- 消息发送成功 ---
-(void)socket:(GCDAsyncSocket*)sock didWriteDataWithTag:(long)tag{NSLog(@"TCP发送成功");
}#pragma mark - 🔥🔥🔥🔥🔥🔥🔥🔥#pragma mark --- 发送数据 ---
-(void)sendDataToServer:(id)data{[self.sendDataArray addObject:data];[self sendeDataToServer];//      [self.asyncTcpSocket  writeData:data withTimeout:60 tag:0];
}#pragma mark --- 发送数据给服务器 详细处理 ---/** 发送数据的详细处理 */
-(void)sendeDataToServer{WSELF//把数据放到一个请求队列中dispatch_async(self.queue, ^{//网络判断  没有网络的情况if (AFNetworkReachabilityManager.sharedManager.networkReachabilityStatus == AFNetworkReachabilityStatusNotReachable) {//开启网络检测定时器[wself noNetWorkStartTestingTimer];}else{ //有网络情况//判断对象是否存在if(wself.asyncTcpSocket != nil) {//判断TCP是否处于连接状态if(wself.asyncTcpSocket.isConnected) {//判断数据  是否存在if(wself.sendDataArray.count>0) {id sendData = wself.sendDataArray[0];NSLog(@"TCP发送出去的数据: %@",sendData);[self.asyncTcpSocket writeData:sendData withTimeout:30  tag:0];[wself.sendDataArray removeObjectAtIndex:0];if([wself.sendDataArray count] >0){[wself sendeDataToServer];}}}else{//TCP 处于断开状态//主动去重连服务器  连接成功后 继续发送数据[wself reConnectServer];}}else{[wself reConnectServer];}}});
}#pragma mark - 🔥🔥🔥🔥🔥🔥🔥🔥#pragma mark --- 接收的数据 ---
-(void)socket:(GCDAsyncSocket*)sock didReadData:(NSData*)data withTag:(long)tag
{//      sleep(1);//此方法处理数据的黏包或者断包NSLog(@"原始数据%@",data);NSString*msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];NSLog(@"xdd接收的数据 = %@",msg);//断包处理[self didReadData:data];[self.asyncTcpSocket readDataWithTimeout:-1 tag:0];NSDictionary*retDic = [xddTools dictionaryWithJsonString:msg];if(retDic == nil || ! [retDic isKindOfClass:[NSDictionary class]]) {return ;}NSString*type_ = retDic[@"type"];NSString*data_ = retDic[@"data"];NSString*msgid_ = retDic[@"msgid"]?retDic[@"msgid"]:@"test";NSLog(@"xdd接收的数据type_=%@,type_=%@",type_,data_);//开始主线程
//    dispatch_async(dispatch_get_main_queue(), ^{//开始子线程dispatch_async(dispatch_get_global_queue(0, 0), ^{if(type_ && data_ && [type_ isEqualToString:@"1"]){//获取森林信息NSDictionary*dic = [xddTools getMYinfo:data_];BOOL success =  [dic[@"success"] boolValue]; //是否成功NSString*resultDesc = dic[@"resultDesc"];//信息提示NSString*resultCode = dic[@"resultCode"];//返回代码NSString*currentEnergy = dic[@"treeEnergy"][@"currentEnergy"];//当前能量NSDictionary*userEnergy = dic[@"userEnergy"];NSString*loginId = userEnergy[@"loginId"];//3333@qq.comNSString*userId = userEnergy[@"userId"];//2088*****NSString*headPortrait = userEnergy[@"headPortrait"];//头像NSString*displayName = userEnergy[@"displayName"];//昵称 茶NSString*energySummation = userEnergy[@"energySummation"];//合计能量NSString*treeAmount = userEnergy[@"treeAmount"];//证书个数NSDictionary *dicRetInfo = [NSDictionary dictionaryWithObjectsAndKeys:msgid_,@"msgid",type_,@"type",resultCode,@"code",currentEnergy,@"current",energySummation,@"summation",userId,@"userId",loginId,@"loginId",headPortrait,@"png",treeAmount,@"tree",displayName,@"name",nil];NSData * jsonData = [[xddTools returnJSONStringWithDictionary:dicRetInfo] dataUsingEncoding:NSUTF8StringEncoding];//NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dicRetInfo options:NSJSONWritingPrettyPrinted error:nil];[self sendDataToServer:jsonData];}else if(type_ && data_ && ( [type_ isEqualToString:@"2"] || [type_ isEqualToString:@"4"])){NSDictionary*dic;if([type_ isEqualToString:@"2"]){// 查询用户手机 昵称信息dic = [xddTools getiPhoneInfo:data_];}else if([type_ isEqualToString:@"4"]){// 查询用户ID昵称信息dic = [xddTools getuseriDInfo:data_];}NSString*account = dic[@"userAccount"];NSString*userID = dic[@"userID"];NSString*nickl = dic[@"userNicklName"];NSString*name = dic[@"userName"];NSString*status = dic[@"resultStatus"];NSString*Suffix = dic[@"userNameSuffix"];NSString*RealName = dic[@"userRealName"];NSString*gender = dic[@"gender"];//userNameSuffix 实名名字//userRealName 注册名字//gender 性别NSDictionary *dicRetInfo = [NSDictionary dictionaryWithObjectsAndKeys:msgid_,@"msgid",type_,@"type",status,@"status",account,@"account",userID,@"userID",nickl,@"nickl",name,@"name",Suffix,@"Suffix",RealName,@"RealName",gender,@"gender",nil];//625 对方账户存在异常,不能进行当前操作 100 okNSData * jsonData = [[xddTools returnJSONStringWithDictionary:dicRetInfo] dataUsingEncoding:NSUTF8StringEncoding];//NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dicRetInfo options:NSJSONWritingPrettyPrinted error:nil];[self sendDataToServer:jsonData];}else if(type_ && data_ && [type_ isEqualToString:@"3"]){//获取合种二维码信息NSDictionary*dic = [xddTools gethezhongqrCode:data_];//            BOOL success =  [dic[@"success"] boolValue]; //是否成功
//            NSString*resultDesc = dic[@"resultDesc"];//信息提示
//            NSString*resultCode = dic[@"resultCode"];//返回代码// 可变字典 转可变字典NSMutableDictionary *dict002 = [NSMutableDictionary dictionaryWithDictionary:dic];[dict002 setObject:msgid_ forKey:@"msgid"];[dict002 setObject:type_ forKey:@"type"];[dict002 removeObjectForKey:@"extInfo"];//            NSData * jsonData = [[xddTools returnJSONStringWithDictionary:dict002] dataUsingEncoding:NSUTF8StringEncoding];NSData * jsonData = [NSJSONSerialization dataWithJSONObject:dict002 options:NSJSONWritingPrettyPrinted error:nil];[self sendDataToServer:jsonData];}else if(type_ && data_ && [type_ isEqualToString:@"5"]){//获取签名NSDictionary*dic = [xddTools getAlipaysign:retDic];NSMutableDictionary *dict002 = [NSMutableDictionary dictionaryWithDictionary:dic];[dict002 setObject:msgid_ forKey:@"msgid"];[dict002 setObject:type_ forKey:@"type"];NSData * jsonData = [[xddTools returnJSONStringWithDictionary:dict002] dataUsingEncoding:NSUTF8StringEncoding];[self sendDataToServer:jsonData];}else if(type_ && data_ && [type_ isEqualToString:@"6"]){//获取签名NSDictionary*dic = [xddTools getAlipaysignV1:retDic];NSMutableDictionary *dict002 = [NSMutableDictionary dictionaryWithDictionary:dic];[dict002 setObject:msgid_ forKey:@"msgid"];[dict002 setObject:type_ forKey:@"type"];NSData * jsonData = [[xddTools returnJSONStringWithDictionary:dict002] dataUsingEncoding:NSUTF8StringEncoding];[self sendDataToServer:jsonData];}else if(type_ && data_ && [type_ isEqualToString:@"xxx"]){}});}
#pragma mark - 🔥🔥🔥🔥🔥🔥🔥🔥
#pragma mark --- 黏包 断包处理 ---
-(void) didReadData:(NSData*)data {//断包处理 要根据 你的 数据的 长度标识位的数据 来判断 读到什么地方 才是你完整的数据。根据协议去走_readBuf = [NSMutableData dataWithData:data];// 取出4-8位保存的数据长度,计算数据包长度while(_readBuf.length>=5) {// 头数据为5个字节// 得到数据的ID 和 整个数据的长度NSData *dataLength = [_readBuf subdataWithRange:NSMakeRange(3, 2)];Byte*ByteLength = (Byte*)[dataLength bytes];int headLen = (ByteLength[0] &0x00ff) + ((ByteLength[1] &0x00ff) <<8);NSInteger lengthInteger =0;lengthInteger = (NSInteger)headLen;NSInteger complateDataLength = lengthInteger +6;//算出一个包完整的长度(内容长度+头长度)NSLog(@"已读取数据:缓冲区长度:%ld, 接收长度:%lu  数据长度:%ld ", (long)_readBuf.length, (unsigned long)[data length], (long)complateDataLength);//        NSInteger dataLength = length + 2;if(_readBuf.length>= complateDataLength) {//如果缓存中的数据 够  一个整包的长度NSData*msgData = [_readBuf subdataWithRange:NSMakeRange(0, complateDataLength)];// 处理消息数据NSLog(@"得到完整包数据:%@",msgData);// 从缓存中截掉处理完的数据,继续循环_readBuf= [NSMutableData dataWithData:[_readBuf subdataWithRange:NSMakeRange(complateDataLength,_readBuf.length- complateDataLength)]];//            [self.asyncTcpSocket readDataWithTimeout:-1 tag:0];}else{// 断包情况,继续读取//            [self.asyncTcpSocket readDataWithTimeout:-1 tag:0];//            [sock readDataWithTimeout:-1 buffer:_readBuf bufferOffset:_readBuf.length tag:0];//继续读取数据[self.asyncTcpSocket readDataWithTimeout:-1 buffer:_readBuf bufferOffset:_readBuf.length tag:0];return;}[self.asyncTcpSocket readDataWithTimeout:-1 buffer:_readBuf bufferOffset:_readBuf.length tag:0];//继续读取数据}}@end
//
//  Xddtcp.h
//  YFX_ScoketForClientDemo
//
//  Created by adminxdd on 2020/8/20.
//  Copyright © 2020 fangxue. All rights reserved.
//#import <Foundation/Foundation.h>
#import "AFNetworkReachabilityManager.h"
NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END#import <Foundation/Foundation.h>#import "GCDAsyncSocket.h"#import "xddTools.h"//@interface SingleTcpCase :NSObject
@interface Xddtcp : NSObject@property(strong,nonatomic)GCDAsyncSocket *asyncTcpSocket;/**  单利初始化 */+(instancetype)sharedTcpManager;/**  建立连接 */-(void)connectServer;/**  关闭连接 */-(void)disConnectServer;/**  发送数据给服务器 */-(void)sendDataToServer:(id)data;@end

配置端口

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"请输入配置信息" message:@"++++++" preferredStyle:UIAlertControllerStyleAlert];//增加取消按钮;[alertController addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];//增加确定按钮;[alertController addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {//获取第1个输入框;UITextField *userNameTextField = alertController.textFields.firstObject;//获取第2个输入框;UITextField *passwordTextField = alertController.textFields.lastObject;//NSLog(@"用户名 = %@,密码 = %@",userNameTextField.text,passwordTextField.text);if(userNameTextField.text && ![userNameTextField.text isEqualToString:@""]){[xddTools keySet:@"TCP_IP" v:userNameTextField.text];}if(passwordTextField.text && ![passwordTextField.text isEqualToString:@""]){[xddTools keySet:@"TCP_Port" v:passwordTextField.text];}}]];//定义第一个输入框;[alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {textField.placeholder = @"请输入配置IP";textField.text = [xddTools keyGet:@"TCP_IP"];}];//定义第二个输入框;[alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {textField.placeholder = @"请输入配置端口";textField.text = [xddTools keyGet:@"TCP_Port"];}];[weakSelf presentViewController:alertController animated:true completion:nil];
+(NSString*)keyGet:(NSString*)k
{NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];return [userDefault objectForKey:k]?[userDefault objectForKey:k]:@"";
//    - objectForKey:
//    - URLForKey:
//    - arrayForKey:
//    - dictionaryForKey:
//    - stringForKey:
//    - stringArrayForKey:
//    - dataForKey:
//    - boolForKey:
//    - integerForKey:
//    - floatForKey:
//    - doubleForKey:
//    - dictionaryRepresentation
}
+(void)keySet:(NSString*)k v:(NSString*)v
{NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];[userDefault setObject:v forKey:k];[userDefault synchronize];
//        - setObject:forKey:
//       - setFloat:forKey:
//       - setDouble:forKey:
//       - setInteger:forKey:
//       - setBool:forKey:
//       - setURL:forKey:
}

相关文章:

【iOS逆向与安全】好用的一套 TCP 类

初始化 //页面 %hook xxxxxxxViewController//- (void)viewWillAppear:(BOOL)animated{ //NSLog("View Will Appear&#xff0c;再次进入刷新"); - (void)viewDidLoad{//启动tcp[[Xddtcp sharedTcpManager] connectServer] ;} 发送数据 //发送数据 [[Xddtcp shared…...

Ubuntu Kafka开机自启动服务

1、创建service文件 在/lib/systemd/system目录下创建kafka.service文件 [Unit] DescriptionApache Kafka Server Documentationhttp://kafka.apache.org/documentation.html Requireszookeeper.service[Service] Typesimple Environment"JAVA_HOME/usr/local/programs/j…...

c#实现单例模式的两种方法(饿汉式、懒汉式)

在C#中&#xff0c;可以使用以下几种方式来实现单例模式&#xff1a; 饿汉式单例模式&#xff08;Eager Singleton&#xff09;&#xff1a; 在类加载时就创建实例。私有化构造函数&#xff0c;防止外部实例化。提供一个静态的只读属性来获取实例。代码示例&#xff1a; // 在C…...

Git与Repo:开源开发的得力工具组合

Git与Repo&#xff1a;开源开发的得力工具组合 1. 引言 开源开发在当今的软件行业中扮演着至关重要的角色。它不仅推动了技术的创新和进步&#xff0c;也促进了开发者之间的合作与共享。随着越来越多的开源项目的涌现&#xff0c;有效的代码管理和版本控制成为了必不可少的工…...

centos7 添加网卡设置动态ip,修改网卡为任意名称

centos7 添加网卡并设置动态ip&#xff0c;重命名为任意名称 本文记录如何在centos环境上增加两个网卡&#xff0c;并设置为动态获取ip&#xff0c;以及修改网卡名称为任意名称 1、centos7添加两个网卡动态获取ip 1.1 vmvare上添加网络适配器 1、关闭虚拟机 2、 添加网络适…...

计算机竞赛 深度学习人脸表情识别算法 - opencv python 机器视觉

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习人脸表情识别系…...

nvm安装后node或npm不是内部或外部命令

nvm安装后出现node或npm不是内部或外部命令 进行以下步骤解决 找到nvm安装所在位置&#xff0c;新建一个空的nodejs文件夹 打开 windowr —> sysdm.cpl —> 高级 —>环境变量 将下图中两个位置的地址改成刚刚新建的nodejs空文件夹所在的位置 nvm安装后都是会自动添加…...

Kafka数据可靠性保证

1.生产者发送数据到Topic partition的可靠性保证 为保证producer发送的数据&#xff0c;能可靠的发送到指定的topic&#xff0c;topic的每个partition收到producer发送的数据后&#xff0c;都需要向producer发送ack&#xff08;acknowledgement确认收到&#xff09;&#xff0c…...

基于R的linkET包qcorrplot可视化Mantel test相关性网络热图分析correlation heatmap

写在前面 需求是对瘤胃宏基因组结果鉴定到的差异菌株与表观指标、瘤胃代谢组、血清代谢组、牛奶代谢组中有差异的部分进行关联分析&#xff0c;效果图如下&#xff1a; 数据准备 逗号分隔的csv格式文件&#xff0c;两个表格&#xff0c;一个是每个样本对应的表观指标数据&…...

IOTDB的TsFile底层设计

目录 概述 数据模型 数据结构 元数据注册 读取和写入 设计思想 主要过程...

MATLAB算法实战应用案例精讲-【人工智能】边缘计算(补充篇)

目录 前言 算法原理 传统边缘检测算子 构建通用的边缘检测算子 图...

Linux学习-HIS系统部署(1)

Git安装 #安装中文支持&#xff08;选做&#xff09; [rootProgramer ~]# echo $LANG #查看当前系统语言及编码 en_US.UTF-8 [rootProgramer ~]# yum -y install langpacks-zh_CN.noarch #安装中文支持 [rootProgramer ~]# vim /etc/locale.co…...

Cairo介绍及源码构建安装(3)

接前一篇文章&#xff1a;Cairo介绍及源码构建安装&#xff08;2&#xff09; 四、Cairo构建与安装 2. 配置 BLFS中给出的命令为&#xff1a; ./configure --prefix/usr \--disable-static \--enable-tee 这里将“--prefix”选项由“/usr”调整为“/usr/local”&#x…...

Mac电脑信息大纲记录软件 OmniOutliner 5 Pro for Mac中文

OmniOutliner 5 Pro是一款专业级的Mac大纲制作工具&#xff0c;它可以帮助用户更好地组织和管理信息&#xff0c;以及制作精美的大纲。以下是OmniOutliner 5 Pro的主要功能和特点&#xff1a; 强大的大纲组织和管理功能。OmniOutliner 5 Pro为用户提供了多层次的大纲结构&…...

linux设置应用开机自启(通用:mysql、jar、nginx、solr...)

1. 业务场景 用于单机生产环境&#xff0c;防止服务器断电或者强制重启导致的服务下线。 2. 实现方案 对于无状态服务&#xff0c;可容器部署设置 restart: always&#xff0c;systemctl eable docker对于有状态服务&#xff0c;可编写自启脚本&#xff0c;如下 ① 编写执行…...

Offset Explorer(Kafka消息可视化工具)报invalid hex digit ‘{‘错误解决方法

解决办法&#xff1a; 根据代码的实际情况&#xff0c;设置成对应的值。设置完成后点update、refresh更新。...

深度学习:模型训练过程中Trying to backward through the graph a second time解决方案

1 问题描述 在训练lstm网络过程中出现如下错误&#xff1a; Traceback (most recent call last):File "D:\code\lstm_emotion_analyse\text_analyse.py", line 82, in <module>loss.backward()File "C:\Users\lishu\anaconda3\envs\pt2\lib\site-packag…...

【数值计算方法】非线性方程(组)和最优化问题的计算方法:非线性方程式求根的二分法、迭代法、Newton 迭代法及其Python实现

目录 一、非线性方程式求根 1、二分法&#xff08;Bisection Method、对分法&#xff09; a. 理论简介 b. python实现 2、迭代法&#xff08;Iterative Method&#xff09; a. 理论简介 b. python实现 3、Newton 迭代法&#xff08;Newtons Method&#xff09; a. 理论…...

linux主机名

title: linux主机名 createTime: 2020-10-29 18:05:52 updateTime: 2020-10-29 18:05:52 categories: linux tags: Linux系统的主机名 查询主机名 hostnamehostnamectl 修改主机名 hostnamectl set-hostname <newhostname>...

前端uniapp图片select联动文本切换

图片 代码 <template><!-- 这个是uniapp的下拉框 --><uni-data-select v-model"pay_type" :localdata"range" change"handleSelectChange"></uni-data-select><!-- 图片 --><image :src"dynamicImage&qu…...

java - 包装类

目录 前言 一 什么是包装类? 1.获取包装类的两种方式(了解)(已经淘汰) 2.两种方式获取对象的区别(掌握) 3.自动装箱&&自动装箱 4.Integer常用方法 总结 前言 大家好,今天给大家讲解一下包装类 一 什么是包装类? 在Java中&#xff0c;每个基本数据类型都有对应…...

防火墙基础

目录 1、 防火墙支持那些NAT技术&#xff0c;主要应用场景是什么&#xff1f; 2、当内网PC通过公网域名解析访问内网服务器时&#xff0c;会存在什么问题&#xff0c;如何解决&#xff1f; 3、防火墙使用VRRP实现双机热备时会遇到什么问题&#xff0c;如何解决&#xff1f; 4…...

服务断路器_Resilience4j的断路器

断路器&#xff08;CircuitBreaker&#xff09;相对于前面几个熔断机制更复杂&#xff0c;CircuitBreaker通常存在三种状态&#xff08;CLOSE、OPEN、HALF_OPEN&#xff09;&#xff0c;并通过一个时间或数量窗口来记录当前的请求成功率或慢速率&#xff0c;从而根据这些指标来…...

微信小程序学习笔记3.0

第3章 资讯类:仿今日头条微信小程序 3.1 需求描述及交互分析 需求描述 仿今日头条微信小程序,要具有以下功能。 (1)首页新闻频道框架设计,包括底部标签导航设计、新闻检索框设计及新闻频道滑动效果设计。 (2)首页新闻内容设计,包括新闻标题、新闻图片及新闻评论设计…...

nginx 反向代理 负载均衡 动静分离

一样东西的诞生通常都是为了解决某些问题&#xff0c;对于 Nginx 而言&#xff0c;也是如此。 比如&#xff0c;你出于无聊写了一个小网站&#xff0c;部署到 tomcat 之后可以正常访问 但是后来&#xff0c;你的这个小网站因为内容很诱人逐步的火了&#xff0c;用户越来越多&a…...

Codeanalysis(tca)后端二次开发环境搭建

先试用官方脚本文件件quick_install.sh将整个项目启动起来&#xff0c;然后到每个微服务下查看每个服务的pid进程&#xff0c;需要调试哪个先把对应的微服务关闭手动启动&#xff0c;具体启动流程如下&#xff1a; cd 到项目根目录下 source script\config.sh # 激活系统环境…...

JS前端树形Tree数据结构使用

前端开发中会经常用到树形结构数据&#xff0c;如多级菜单、商品的多级分类等。数据库的设计和存储都是扁平结构&#xff0c;就会用到各种Tree树结构的转换操作&#xff0c;本文就尝试全面总结一下。 如下示例数据&#xff0c;关键字段id为唯一标识&#xff0c;pid为父级id&am…...

Automation Anywhere推出新的生成式AI自动化平台,加速提高企业生产力

在9 月 19 日的Imagine 2023 大会上&#xff0c;智能自动化领域的领导者 Automation Anywhere 宣布对其自动化平台进行扩展。推出了新的 Responsible AI Layer&#xff0c;并宣布了四项关键产品更新&#xff0c;包括全新的 Autopilot&#xff0c;它可以利用生成式 AI &#xff…...

电缆隧道在线监测系统:提升电力设施安全与效率的关键

随着城市化进程的加快&#xff0c;电力电缆隧道在保障城市电力供应方面的地位日益重要。然而&#xff0c;电缆隧道环境复杂&#xff0c;容易受到多种因素影响&#xff0c;如温度、湿度、烟雾、水位等&#xff0c;严重威胁电力设施的安全与稳定运行。在此背景下&#xff0c;电缆…...

Java BigDecimal 详解

目录 一、BigDecimal 1、简介 2、构造器描述 3、方法描述 4、使用 一、BigDecimal float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算&#xff0c;这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而&#xff0c;它…...

网站模板服务商/百度竞价推广的优势

用IE的时候&#xff0c;地址栏的路径会多了一层或几层。在js用 window.location.href跳转&#xff0c;用相对路径&#xff0c;google是在项目名后&#xff0c;IE却多一层 。 解答&#xff1a; 其实这个不管iE和chrome不一样。其实也包括Firefox。这是浏览器对相对路径的解析不…...

东山县建设银行网站/品牌运营管理有限公司

版权声明&#xff1a;本文首发 http://asing1elife.com &#xff0c;转载请注明出处。 https://blog.csdn.net/asing1elife/article/details/82848367 i18n是internationalization首字母i和末尾字母n以及中间18个字母的简称&#xff0c;意于国际化 更多精彩 更多技术博客&#…...

新乡模板建站/宁波seo排名公司

1.有时svn下载过程中突然异常中断了 2.update时&#xff0c;提示Please execute the Cleanup command. 3.Cleanup时&#xff0c;又提示其他错误 解决办法&#xff1a; update时&#xff0c;选择break write locks “update时&#xff0c;选择break write locks”描述存在问…...

如何网上快速接网站开发订单/微信公众号推广

一、前言 二叉树的顺序结构实现虽然很容易&#xff0c;但是在创建过程中&#xff0c;不免要浪费掉很多空间&#xff0c;为了减少空间浪费&#xff0c;从而提出链表的链式存储&#xff0c;虽然链式存储也很浪费空间&#xff0c;但是在某些二叉树中要节约很多空间&#xff0c;同…...

中国体育直播在线观看斯诺克赛/西安seo网站关键词

AngularJS 1.2版本中提供了Controller As语法&#xff0c;简单说就是可以在Controller中使用this来替代$scope&#xff0c;使得Controller更像一个传统的JS类&#xff0c;相对于$scope的继承树要理解上要简单一些。 基础用法 传统的Controller是这样写的&#xff1a; app.contr…...

做ppt模板网站/百度百科入口

http://rcv.kaist.ac.kr/~ail/...