iOS开发之网络监听(一)Reachability

2023-11-02

demo下载

Reachability对系统的网络状况类SCNetworkReachability进行的封装,持有全局的网络状况句柄reachabilityRef,简化了SCNetworkReachability的Api以及网络状态,使开发者使用起来更加简单。

总而言之,这是一个用来检测网络状态的一个三方类,功能类似于AF的网络管理类AFNetworkReachabilityManager。

1、简单使用

#import "ViewController.h"
#import "Reachability.h"

@interface ViewController ()

//网络管理类,全局的
@property (nonatomic, strong) Reachability *reachability;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    //初始化
    self.reachability = [Reachability reachabilityForInternetConnection];
    //当前网络状态
    NSLog(@"当前网络状态:%ld",(long)[self.reachability currentReachabilityStatus]);
    NSLog(@"%@", self.reachability.currentReachabilityString);
    //开启网络状态变化的监听,开启网络监听
    [self.reachability startNotifier];
    
    //断网回调
    self.reachability.unreachableBlock = ^(Reachability *reachability) {
        //注意这里的回调是在在子线程中
        NSLog(@"子线程 : %@",[NSThread currentThread]);
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"无网了!");
        });
    };
    //来网回调
    self.reachability.reachableBlock = ^(Reachability *reachability) {
        NSLog(@"子线程 :%@",[NSThread currentThread]);
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"有网了!");
            switch (reachability.currentReachabilityStatus) {
                case ReachableViaWiFi:
                    
                    break;
                case ReachableViaWWAN:
                    
                    break;
                    
                default:
                    break;
            }
        });
    };
}

- (void)dealloc {
    [self.reachability stopNotifier];
}

@end

不开启网络状态监听,可以直接get到网络状态等。开启了,网络状态改变会回调。

回调是在子线程中回调的,通知是在主线程,可以看看源码回调方法的实现:

-(void)reachabilityChanged:(SCNetworkReachabilityFlags)flags

2、Reachability内部实现逻辑

1、创建Reachability对象

+(Reachability *)reachabilityForInternetConnection 
{   
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;
    
    return [self reachabilityWithAddress:&zeroAddress];
}

在这个方法中创建了sockaddr_in类型的zeroAddress,即hostName,并设置了其sin_len和sin_family。

+(Reachability *)reachabilityWithAddress:(void *)hostAddress
{
    SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)hostAddress);
    if (ref) 
    {
        id reachability = [[self alloc] initWithReachabilityRef:ref];
        
        return reachability;
    }
    
    return nil;
}

将第一步创建的zeroAddress传入这个方法中,调用系统SCNetworkReachability类中SCNetworkReachabilityRef的创建函数,传入zeroAddress等参数,创建了ref。

-(Reachability *)initWithReachabilityRef:(SCNetworkReachabilityRef)ref 
{
    self = [super init];
    if (self != nil) 
    {
        self.reachableOnWWAN = YES;
        self.reachabilityRef = ref;

        // We need to create a serial queue.
        // We allocate this once for the lifetime of the notifier.

        self.reachabilitySerialQueue = dispatch_queue_create("com.tonymillion.reachability", NULL);
    }
    
    return self;    
}

继而将创建的ref传入最终的init方法中,将ref保存为全局的变量reachabilityRef,顺便创建了一个串行队列,暂时不知道其作用。

2、获取网络状态

对象创建完后,就可以获取网络状态了。

-(NetworkStatus)currentReachabilityStatus
{
    if([self isReachable])
    {
        if([self isReachableViaWiFi])
            return ReachableViaWiFi;
        
#if	TARGET_OS_IPHONE
        return ReachableViaWWAN;
#endif
    }
    
    return NotReachable;
}

这里先调用了isReachable方法

-(BOOL)isReachable
{
    SCNetworkReachabilityFlags flags;  
    
    if(!SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))
        return NO;
    
    return [self isReachableWithFlags:flags];
}

这个方法中调用系统类SCNetworkReachability中的SCNetworkReachabilityGetFlags函数,获取了系统的网络状态的flags。

取到flags后,调用了如下方法

-(BOOL)isReachableWithFlags:(SCNetworkReachabilityFlags)flags
{
    BOOL connectionUP = YES;
    
    if(!(flags & kSCNetworkReachabilityFlagsReachable))
        connectionUP = NO;
    
    if( (flags & testcase) == testcase )
        connectionUP = NO;
    
#if	TARGET_OS_IPHONE
    if(flags & kSCNetworkReachabilityFlagsIsWWAN)
    {
        // We're on 3G.
        if(!self.reachableOnWWAN)
        {
            // We don't want to connect when on 3G.
            connectionUP = NO;
        }
    }
#endif
    
    return connectionUP;
}

取到系统的flags后其实网络状态已经知道了,再用这个方法的目的是将系统复杂的flags简单化,简化成,有网络和无网络。这个方法只判断有网络还是无网络。

返回到-(NetworkStatus)currentReachabilityStatus方法,如果无网络,直接返回NotReachable,如果有,则又调用了如下方法判断是不是WIFI网络,如果是返回ReachableViaWiFi不是直接返回ReachableViaWWAN。

-(BOOL)isReachableViaWiFi 
{
    SCNetworkReachabilityFlags flags = 0;
    
    if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))
    {
        // Check we're reachable
        if((flags & kSCNetworkReachabilityFlagsReachable))
        {
#if	TARGET_OS_IPHONE
            // Check we're NOT on WWAN
            if((flags & kSCNetworkReachabilityFlagsIsWWAN))
            {
                return NO;
            }
#endif
            return YES;
        }
    }
    
    return NO;
}

整个流程一气呵成,思维缜密,没找出一点漏洞,感觉很完美。

3、开启网络监听

-(BOOL)startNotifier
{
    // allow start notifier to be called multiple times
    if(self.reachabilityObject && (self.reachabilityObject == self))
    {
        return YES;
    }

    
    SCNetworkReachabilityContext    context = { 0, NULL, NULL, NULL, NULL };
    context.info = (__bridge void *)self;

    if(SCNetworkReachabilitySetCallback(self.reachabilityRef, TMReachabilityCallback, &context))
    {
        // Set it as our reachability queue, which will retain the queue
        if(SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, self.reachabilitySerialQueue))
        {
            // this should do a retain on ourself, so as long as we're in notifier mode we shouldn't disappear out from under ourselves
            // woah
            self.reachabilityObject = self;
            return YES;
        }
        else
        {
#ifdef DEBUG
            NSLog(@"SCNetworkReachabilitySetDispatchQueue() failed: %s", SCErrorString(SCError()));
#endif

            // UH OH - FAILURE - stop any callbacks!
            SCNetworkReachabilitySetCallback(self.reachabilityRef, NULL, NULL);
        }
    }
    else
    {
#ifdef DEBUG
        NSLog(@"SCNetworkReachabilitySetCallback() failed: %s", SCErrorString(SCError()));
#endif
    }

    // if we get here we fail at the internet
    self.reachabilityObject = nil;
    return NO;
}

通过SCNetworkReachabilitySetCallback(,)函数注册了回调,实现这个函数当网络状态改变时回会执行响应的回调方法。这个函数中第一个参数及时初始化的时候创建ReachabilitySCNetworkReachabilityRef对象reachabilityRef。第二个参数传入了一个函数SCNetworkReachabilityCallBack类型的函数。

然后通过函数SCNetworkReachabilitySetDispatchQueue(,)将自己初始化类的时候创建的队列和reachabilityRef传入,在系统类的SCNetworkReachability里面应该是注册了回调以及回调的方法。

如果注册成功了,self.reachabilityObject = self,这样就可以理解这个方法刚开始的判断的目的了。完美的防止了重复多次的startNotifier。

当网络状态改变时,会通过TMReachabilityCallback这个函数回调,在这个函数里

static void TMReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info) 
{
#pragma unused (target)

    Reachability *reachability = ((__bridge Reachability*)info);

    // We probably don't need an autoreleasepool here, as GCD docs state each queue has its own autorelease pool,
    // but what the heck eh?
    @autoreleasepool 
    {
        [reachability reachabilityChanged:flags];
    }
}

调用了判断网络状态的方法,然后进行了回调和通知的发送

-(void)reachabilityChanged:(SCNetworkReachabilityFlags)flags
{
    if([self isReachableWithFlags:flags])
    {
        if(self.reachableBlock)
        {
            self.reachableBlock(self);
        }
    }
    else
    {
        if(self.unreachableBlock)
        {
            self.unreachableBlock(self);
        }
    }
    
    // this makes sure the change notification happens on the MAIN THREAD
    dispatch_async(dispatch_get_main_queue(), ^{
        [[NSNotificationCenter defaultCenter] postNotificationName:kReachabilityChangedNotification 
                                                            object:self];
    });
}

可以看到通知是在主线程发送的,回调是在子线程中。

3、Reachability.h

1、一个通知

.h

extern NSString *const kReachabilityChangedNotification;

.m

NSString *const kReachabilityChangedNotification = @"kReachabilityChangedNotification";

网络状态变化通知名

2、一个枚举

typedef NS_ENUM(NSInteger, NetworkStatus) {
    // Apple NetworkStatus Compatible Names.
    NotReachable = 0,
    ReachableViaWiFi = 2,
    ReachableViaWWAN = 1
};

网络状况的枚举

3、两个回调

typedef void (^NetworkReachable)(Reachability * reachability);
typedef void (^NetworkUnreachable)(Reachability * reachability);

网络状况回调

4、构造方法

5、开启和关闭监听的方法

-(BOOL)startNotifier;
-(void)stopNotifier;

6、其他方法

其他一些get方法,获取当前网络状态,获取网络是否可达等。

4、构造方法

+(Reachability *)reachabilityForInternetConnection

+(Reachability *)reachabilityForInternetConnection 
{   
    //定义了一个类型为sockaddr_in的结构体变量zeroAddress
    struct sockaddr_in zeroAddress;      
    //bzero()函数传入了两个参数      
    bzero(&zeroAddress, sizeof(zeroAddress));
    //指定了zeroAddress变量的sin_len的值,即zeroAddress的字节大小
    zeroAddress.sin_len = sizeof(zeroAddress);
    //制定了zeroAddress变量的地址族
    zeroAddress.sin_family = AF_INET;
    //以上几步是创建了一个IP地址的变量zeroAddress
    
    return [self reachabilityWithAddress:&zeroAddress];
}

sockaddr_in

struct sockaddr_in {
	__uint8_t	sin_len;           // 这是定义了一个__uint8_t类型的sin_len
	sa_family_t	sin_family;		    // 地址族
	in_port_t	sin_port;		    // 16位的TCP/UDP端口号
	struct	in_addr sin_addr;	    // 32位的IPV4地址
	char		sin_zero[8];          // 
};

bzero

baero(),这个函数传入了两个参数,&zeroAddress 和 sizeof(zeroAddress),zeroAddress的地址和长度。

AF_INET

这个宏定义:#define AF_INET 2 /* internetwork: UDP, TCP, etc. */

+(Reachability *)reachabilityWithAddress:(void *)hostAddress

+(Reachability *)reachabilityWithAddress:(void *)hostAddress
{
    SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)hostAddress);
    if (ref) 
    {
        id reachability = [[self alloc] initWithReachabilityRef:ref];
        
        return reachability;
    }
    
    return nil;
}

创建网络句柄ref,传入参数CFAllocatorRef类型的参数1,const struct sockaddr类型的参数2。

SCNetworkReachabilityCreateWithAddress是定义在SCNetworkReachability类中的一个函数,使用该函数传入struct sockaddr_in类型的域名地址和CFAllocatorRef类型的参数(叫个什么名字好呢),快捷的创建出一个网络句柄对象SCNetworkReachabilityRef

CFAllocatorRef在CoreFoundation框架中。

void *

不确定类型指针,OC中的id?

SCNetworkReachabilityRef

SCNetworkReachabilityRef 在 SystemConfiguration/SystemConfiguration.h 框架中,定义在SCNetworkReachability类中,是网络地址名称的句柄。

定义:

typedef const struct CF_BRIDGED_TYPE(id) __SCNetworkReachability * SCNetworkReachabilityRef;

-(Reachability *)initWithReachabilityRef:(SCNetworkReachabilityRef)ref

-(Reachability *)initWithReachabilityRef:(SCNetworkReachabilityRef)ref 
{
    self = [super init];
    if (self != nil) 
    {
        self.reachableOnWWAN = YES;
        self.reachabilityRef = ref;

        // We need to create a serial queue.
        // We allocate this once for the lifetime of the notifier.

        self.reachabilitySerialQueue = dispatch_queue_create("com.tonymillion.reachability", NULL);
    }
    
    return self;    
}

这个就是Reachability的初始化方法了。

从上一个方法中传入网络句柄ref,设置成了全局的属性,创建了一个全局的串行队列。

二、SCNetworkReachability

1、作用:

The SCNetworkReachability API allows an application to
		determine the status of a system's current network
		configuration and the reachability of a target host.
		In addition, reachability can be monitored with notifications
		that are sent when the status has changed.

简单的来说SCNetworkReachability提供的Api可以获取目标域名下,手机系统的网络状况和配置信息,甚至可以对网络状态的变化进行监听。

2、Api:

1、SCNetworkReachabilityFlags

定义了网络状态的OPTIONS

2、SCNetworkReachabilityRef

This is the handle to a network address or name.

3、SCNetworkReachabilityCallBack

typedef void (*SCNetworkReachabilityCallBack)	(
						SCNetworkReachabilityRef			target,
						SCNetworkReachabilityFlags			flags,
						void			     *	__nullable	info
						);

SCNetworkReachabilityCallBack 网络状地址网络可达性改变回调函数,回调三个参数,一个网络句柄SCNetworkReachabilityRef类型的target,网络目标对象,一个网络状况Option,一个不确定类型的info。

通过这个回调将对应网络域名的网络状况进行了回调,并可以携带其他信息info。

4、SCNetworkReachabilityCreateWithAddress

SCNetworkReachabilityRef __nullable
SCNetworkReachabilityCreateWithAddress		(
						CFAllocatorRef			__nullable	allocator,
						const struct sockaddr				*address
						)				API_AVAILABLE(macos(10.3), ios(2.0));

这个函数提供了一个创建指定网络地址引用对象的函数。

传入参数allocator,CFAllocatorRef是什么?

sockaddr,网络域名的结构体变量。

返回SCNetworkReachabilityRef类型的网络句柄对象,也是一个结构体。

5、SCNetworkReachabilityGetFlags

Boolean
SCNetworkReachabilityGetFlags			(
						SCNetworkReachabilityRef	target,
						SCNetworkReachabilityFlags	*flags
						)				API_AVAILABLE(macos(10.3), ios(2.0));

从函数体上看传入falg和对应的网络句柄对对象,判断当前网络句柄下该网络状态是否可达。

6、其他

思考

句柄是什么?

句柄就是综合一个聚合相关功能的结构体?

网络句柄SCNetworkReachabilityRef,里面聚合了SCNetworkReachability对象的结构体,SCNetworkReachability本身也是一个结构体。对象的本质就是一个结构体。

句柄是什么呢?只可意会,不可言传。

iOS开发之网络监听(一)Reachability
iOS开发之网络监听(二)SCNetworkReachability

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS开发之网络监听(一)Reachability 的相关文章

  • 具有相等宽度和高度 TD 的响应式表格

    如何创建每个单元格 TD 具有相同宽度和高度的响应式 HTML 表格 因此 当我调整浏览器窗口的大小或调整表格容器的大小时 表格将调整大小 但每个单元格将具有相同的高度和宽度 基金会不关心这个 当我用固定宽度和高度 以像素为单位 初始化 T
  • 如何使用 JRE 部署 JavaFX 11 桌面应用程序

    我有一个 JavaFX JDK 8 桌面业务应用程序 它使用 Java Web Start 进行部署 用户安装了 Java 8 只需访问 URL 我的 AWS Linux 服务器上的公共 URL 即可下载 启动应用程序 使用 Web Sta
  • 使用 BASH 和 AWK 创建 HTML 表

    我在创建 html 表来显示文本文件中的统计信息时遇到问题 我确信有 100 种方法可以做得更好 但这里是 以下脚本中的注释显示了输出 bin bash function getapistats curl s http api exampl
  • python pandas如何在多个条件下过滤字符串

    我有以下数据框 import pandas as pd data 5Star FiveStar five star fiv estar data pd DataFrame data columns columnName 当我尝试用一 种条件
  • 连接运算符 + 或 ,

    var1 abc var2 xyz print literal var1 var2 literalabcxyz print literal var1 var2 literal abc xyz 除了带有 的自动空格之外 两者有什么区别 哪个通
  • Python列表问题

    我在使用 python 列表时遇到问题 简化版本是 mylist1 some items in a list mylist2 mylist1 mylist1 pop i mylist insert i item print mylist1
  • '>&0' 有用途吗(重定向到标准输入)?

    在 bash 中你可以这样做 echo test gt 1 重定向到标准输出 尽管它已经到那里了 echo test gt 2 重定向到标准错误 echo test gt 0 重定向到标准输入 当我做最后一个时 我的终端仍然打印test就像
  • Firebase/Firestore 事务是否会创建内部队列?

    我想知道交易是否 https firebase google com docs firestore manage data transactions https firebase google com docs firestore mana
  • Chrome 中的 addEventListener

    我正在关注 Lynda com 上有关新 DOM 事件模型的教程 这是我正在使用的代码 function addEventHandler oNode sEvt fFunc bCapture if typeof window event un
  • 在私有 guice 模块中公开 Map

    我在 guice 中有一个 PrivateModule 我想从该模块公开一个 Map public class TestInjectionModule extends PrivateModule expose Map class annoa
  • 将 pandas 数据框中的多列更改为日期时间

    我有一个 13 列和 55 000 行的数据框 我正在尝试将其中 5 行转换为日期时间 现在它们返回类型 对象 我需要转换这些数据以进行机器学习 我知道如果我这样做 data birth date pd to datetime data b
  • Pandas 替换特定列上的值

    我知道这两个类似的问题 熊猫替换值 https stackoverflow com questions 27117773 pandas replace values Pandas 替换数据框中的列值 https stackoverflow
  • 如何在 CruiseControl.net 中配置 svn 任务来检测 subversion 外部更改

    我在 subversion 中有一个 net 项目 它持续集成 Cruisecontrol net 我使用Svn源代码控制CCNET任务 net 项目库目录 其中包含配置为 subversion 外部的一组可重用组件 ProjectA li
  • C#:如何处理乱序 TCP 数据包?

    请有人解释一下如何处理乱序数据包 我使用原始套接字来捕获数据包 并在数据包到来时解析它们 但其中一些数据包的顺序错误 例如 ID 标志 16390 PSH ACK 16535 PSH ACK 16638 确认 16640 PSH ACK 1
  • Android Nougat 无法显示某些矢量文件 (Resources$NotFoundException)

    我一直在开发一个包含许多矢量图形的应用程序 最近我开始在 Nougat 上测试它 发现它立即崩溃了 logcat 在加载矢量时显示 Resources NotFoundException 这让人想起带有矢量图形的 Android 早期版本中
  • 如何获取 EC2 实例的 CloudWatch 指标数据

    我想获取我的 EC2 实例的 Cloudmetrics 数据 以便我可以使用这些数据绘制图表并将其显示在我的 Android 设备上 我怎么做 有相同的示例程序或教程吗 提前致谢 这就是我正在做的 private static void f
  • 调试客户端时使用 Chrome/Firefox

    我正在使用带有 getUserMedia 的相机 但出现了一些需要修复的错误 问题是 Visual Studio 只允许我使用 IE 调试 JavaScript 我的意思是命中断点 而 IE 不支持 getUserMedia 如果您想在 I
  • 如何限制mySQL中的搜索和替换字符串

    我用它来搜索和替换 mySQL 中的字符串 UPDATE products SET prodname REPLACE prodname S S 这些产品包含诸如 TYLENOL TABS 100 S 之类的字符串 我想将其转换为 TYLEN
  • 是否可以使用具有余弦相似度的 KDTree?

    看来我不能使用这个相似度度量sklearn例如 KDTree 但我需要 因为我正在使用测量单词向量相似度 对于这种情况 快速鲁棒定制算法是什么 我知道关于Local Sensitivity Hashing 但它应该经过大量调整和测试才能找到
  • 如何对“2-1”这样的字符串进行数学计算以产生“1”?

    我只是想知道 PHP 是否有一个函数可以接受像这样的字符串2 1并产生它的算术结果 或者我必须手动执行此操作explode 获取算术运算符左侧和右侧的值 我知道这个问题很老了 但我昨晚在寻找不太相关的东西时遇到了它 而且这里的每个答案都很糟

随机推荐

  • C++11 类的六大基本成员函数默认生成,default字段的含义

    总览 核心 编译器会为一个类按需自动生成成员函数 C 98 构造 析构 拷贝构造 拷贝赋值 C 11 有了右值 就多了两个 移动构造和移动赋值 功能 构造 无参构造 T 析构 调用成员变量析构 T 拷贝构造 同类型对象初始化 T a b a
  • Redis源码分析(一)--Redis结构解析

    从今天起 本人将会展开对Redis源码的学习 Redis的代码规模比较小 非常适合学习 是一份非常不错的学习资料 数了一下大概100个文件左右的样子 用的是C语言写的 希望最终能把他啃完吧 C语言好久不用 快忘光了 分析源码的第一步 先别急
  • 调用bat执行planning规则/规则集

    示例 c cd C Oracle Middleware user projects epmsystem1 Planning Planning1 echo begin run 规则集测试 echo 规则集测试开始时间 DATE time gt
  • Matterport3D:室内环境RGB-D数据的深度学习

    Matterport3D 室内环境RGB D数据的深度学习 Taylor Guo 2017年9月24日 Matterport3D Learning from RGB D Data in Indoor Environments Matterp
  • Java中的常量和类常量有什么区别?

    Java中的常量和类常量有什么区别 常量是在程序中固定不变的值 而类常量是属于类的特定常量 它们在Java中有一些区别 常量 Constants 是指在程序中定义的一些不可改变的值 它们通常用关键字final来声明 并且在声明时必须进行初始
  • 还在一张张的保存图集?教你用27行代码一件获取

    嗨嗨 你们好 对于一张一张的保存图片太麻烦了 教你如何利用python一件获取写真图集 只需要27行代码 来吧 先准备一下 首先我们需要自己安装一下这两个第三方模块 requests gt gt gt pip install request
  • Pandas 获取 Dataframe 总的行数 和 列数

    Pandas 获取 DataFam 总的行数 和 列数 返回列数 df shape 1 返回行数 df shape 0 或者 len df
  • CentOS Linux 7.4中polkit服务启动失败

    错误描述 最近新装系统后 真机电脑需要安装ftp和chrony等软件 装包 修改配置文件后 启动服务时出现报错 Error getting authority Eroor initializing authority Error calli
  • WEB安全之XXE实体注入

    WEB安全之XXE实体注入 基础知识 什么是 XML XML代表 可扩展标记语言 XML 是一种设计用于存储和传输数据的语言 与 HTML 一样 XML 使用标记和数据的树状结构 与 HTML 不同 XML 不使用预定义的标记 因此可以为标
  • 全连接神经网络详解(Full Connect Neural Network)

    文章目录 前言 一 单层神经网络 1 1 正向传播 1 2 损失函数 1 3 梯度下降 二 浅层神经网络 2 1 正向传播 2 2 反向传播 三 深层神经网络 3 1 ImageNet发展史 3 2 网络参数 总结及展望 前言 深度学习最基
  • Linux常用技巧系列:查询进程号、kill进程 (centos7 / ubuntu适用 图文教程)

    1 杀死进程 kill 9 xxx 最为常用 或者 killall 9 NAME 如果强制kill 可以加sudo kill 9 xx 例如 首先查询进程 例如查询和python相关的进程 如何查询进程见下文 root localhost
  • 虚拟机软件登录最牛软件MobaXterm百度云分享

    链接地址 MobaXterm百度云传送门 提取码 itsi
  • 串口通信通过Tcp传到服务器实现串口数据转发

    主要目的 通过串口获取外设的数据 转发到服务器进行处理并在Web端显示设备的信息 主要用到的知识点 第一 串口通信相关的知识 1 串口通信用到的两个头文件 include
  • Jetson Nano安装系统和SDK【第二部分】

    一 写在前面 第二部分承接第一部分 第二部分的主要内容是使用虚拟机 为Nano EMMC安装系统与SDK 本部分刷入的Jetpack为 v4 6 2 是截至文章发布日的最新系统 刷入的SDK信息如下 二 安装系统和SDK 03 Nano E
  • 设计模式-装饰模式

    文章目录 前言 装饰模式介绍 实例 使用场景 优缺点 前言 当需要动态地给对象添加额外的功能 而又不想改变其类结构时 装饰模式 Decorator Pattern 是一个非常有用的设计模式 它属于结构型设计模式 通过组合来增加对象的功能 而
  • django在model中添加字段报错

    在以下类中添加 description 字段后 class Colors models Model colors models CharField u 颜色 max length 10 description models CharFiel
  • 每日一题——判断是不是平衡二叉树

    题目 输入一棵节点数为 n 二叉树 判断该二叉树是否是平衡二叉树 在这里 我们只需要考虑其平衡性 不需要考虑其是不是排序二叉树 平衡二叉树 Balanced Binary Tree 具有以下性质 它是一棵空树或它的左右两个子树的高度差的绝对
  • Error [ERR_REQUIRE_ESM] And Design Pro初始化报错

    Error ERR REQUIRE ESM And Design Pro初始化报错 今天创建项目 用And Design Pro初始化的时候报错 不能创建项目 如下图 D Code front gt pro create myapp D P
  • 通过鼠标滚轮实现缩放效果

    using System Collections using System Collections Generic using UnityEngine public class Scroll MonoBehaviour void Updat
  • iOS开发之网络监听(一)Reachability

    demo下载 Reachability对系统的网络状况类SCNetworkReachability进行的封装 持有全局的网络状况句柄reachabilityRef 简化了SCNetworkReachability的Api以及网络状态 使开发