IOS网络编程接口

IOS网络篇4之Socket通信(传递图片和基本数据) 紧接这一篇: http://blog.youkuaiyun.com/u014011807/article/details/39894247 阅读详情

IOS网络编程接口

IOS 可以采用三类api接口进行网络编程,根据抽象层次从低到高分别为socket方式、stream方式、url 方式。

一、socket 方式

       IOS 提供的socket 方式的网络编程接口为CFSocket。CFSocket是BSDsockets的抽象和封装,CFSocket提供BSD sockets几乎所有的功能,并与run loop集成,用来实现多线程网络编程和网络事件监听。基于 CFSocket可以实现各种类型的socket编程,包括stream-based 的sockets(如tcp)和packet-based 的sockets(如udp)。需要注意的是在iOS中CFSocket接口在需要时不自动激活设备的 cellular modem或on-demand VPN。

      CFSocket包括以下编程接口,包括Socket的 创建、配置,以及根据创建和配置好的Socket 进行 远程通讯等接口。

1  Socket的创建

1 .1、CFSocketCreate

创建一个特定协议和类型的 CFSocket对象

1.2、CFSocketCreateWithSocketSignature

该接口根据一个包含通讯协议和地址的CFSocketSignature结构来创建一个CFSocket对象

 

1.3、CFSocketCreateConnectedToSocketSignature

该接口在创建一个CFSocket对象的同时还与一个远端主机进行连接。

 

1.4、CFSocketCreateWithNative

该接口通过封装一个存在的 BSD socket来创建一个CFSocket对象。

 

2   Socket的配置

2.1   CFSocketCopyAddress

功能:返回一个 CFSocket对象的本地地址。

语法:

SWIFT

func CFSocketCopyAddress(_ s: CFSocket!)-> CFData!

2.2、CFSocketCopyPeerAddress

功能:返回与一个 CFSocket对象连接的远端地址。

语法:

SWIFT

func CFSocketCopyPeerAddress(_ s:CFSocket!) -> CFData!

2.3  CFSocketDisableCallBacks

功能:临时取消一个CFSocket对象创建时指定的某种类型的事件回调。

语法:

SWIFT

func CFSocketDisableCallBacks(_ s:CFSocket!,

                            _callBackTypes: CFOptionFlags)

2.4   CFSocketEnableCallBacks

功能:重新允许先前CFSocketDisableCallBacks函数取消的某种类型的事件回调。

语法:

SWIFT

func CFSocketEnableCallBacks(_ s:CFSocket!,

                           _callBackTypes: CFOptionFlags)

2.5 CFSocketGetContext

功能:返回一个CFSocket对象的上下文信息。

语法:

SWIFT

func CFSocketGetContext(_ s: CFSocket!,

                      _context: UnsafeMutablePointer<CFSocketContext>)

2.6 CFSocketGetNative

返回与一个CFSocket对象相关的本地BSD socket。

语法:

SWIFT

func CFSocketGetNative(_ s: CFSocket!)-> CFSocketNativeHandle

2.7   CFSocketGetSocketFlags

功能:返回控制一个CFSocket对象的确定行为的 标志。

语法:

SWIFT

func CFSocketGetSocketFlags(_ s: CFSocket!)-> CFOptionFlags

 

2.8 CFSocketSetSocketFlags

功能:设置控制一个CFSocket对象的确定行为的 标志。

语法:

SWIFT

func CFSocketSetSocketFlags(_ s: CFSocket!,

                          _flags: CFOptionFlags)

2.9 CFSocketSetAddress

语法:

SWIFT

func CFSocketSetAddress(_ s: CFSocket!,

                      _address: CFData!) -> CFSocketError

功能:为一个CFSocket对象绑定一个本地地址并在本地socket支持的情况下对socket进行配置使其处于监听状态。该函数对应本地socket的bind以及listen功能。一旦CFSocket对象绑定地址,依赖于socket的协议,其它进程和主机能连接到该CFSocket对象。

 

3、Sockets的使用

3.1 CFSocketConnectToAddress

功能:打开与一个远程socket的一个连接。

语法:

SWIFT

func CFSocketConnectToAddress(_ s:CFSocket!,

                            _address: CFData!,

                            _timeout: CFTimeInterval) -> CFSocketError

3.2 CFSocketCreateRunLoopSource

语法:

SWIFT

func CFSocketCreateRunLoopSource(_allocator: CFAllocator!,

                               _s: CFSocket!,

                               _order: CFIndex) -> CFRunLoopSource!

功能:为一个CFSocket对象创建一个CFRunLoopSource对象。该创建的 CFRunLoopSource对象不自动添加到一个run loop。为了增加该runloop source到某个run loop,需要调用CFRunLoop对象 的CFRunLoopAddSource函数来为该CFRunLoop对象添加runloop source。

3.3CFSocketGetTypeID

功能:返回CFSocket对象的 opaque类型对应的类型标示符。

语法:

SWIFT

func CFSocketGetTypeID() -> CFTypeID 

3.4 CFSocketInvalidate

功能:使一个CFSocket对象无效,使其停止接收和发送任何消息。

语法:

SWIFT

func CFSocketInvalidate(_ s: CFSocket!)

3.5CFSocketIsValid

功能:返回一个指示一个CFSocket对象是否有效及是否能够发送和接收消息的布尔值。

语法:

SWIFT

func CFSocketIsValid(_ s: CFSocket!) ->Boolean

3.6 CFSocketSendData

功能:该函数用来通过一个CFSocket对象发送数据。

语法:

SWIFT

func CFSocketSendData(_ s: CFSocket!,

                    _address: CFData!,

                    _data: CFData!,

                    _timeout: CFTimeInterval) -> CFSocketError

 

二、stream编程模式

      stream编程模式提供了与unix 的文件操作类似的模式。首先创建和设置流,接着打开流,然后读写流,在流存在时还可以通过查询流的相关属性来读取流的相关信息,在流使用完毕后关闭流。

      iOS 为stream编程模式提供的api编程接口包括两大类,一类是Core Foundation框架层用C语言实现的CFStream  API(包括CFStream、CFReadStream 、CFWriteStream等),一类是基于其上的在Foundation框架层用Objective-C语言实现的NSStream API(包括NSStream、NSInputStreamNSOutputStream等),两者提供相似的接口和行为,其中某些对象是toll-free bridged类型的,如CFStream 与NSStream,CFReadStream与NSInputStream,CFWriteStream与NSOutputStream之间,因此可以混合使用。

      开发人员可以根据自己的语言偏好选择使用。

      CFStream API的主要接口:

1、CFStream 创建接口

1.1 CFStreamCreatePairWithPeerSocketSignature

         功能:创建一对到一个socket的可读和可写流。

1.2CFStreamCreatePairWithSocketToHost

功能:创建连接到一个特定主机的特定端口的一对可读写流。

1.3 CFStreamCreatePairWithSocket

功能:创建一对连接到一个socket的可读写流

1.4 CFStreamCreateBoundPair

功能:创建一对读写流。

其它可读写流创建接口:

 1.5 CFReadStreamCreateForHTTPRequest

   功能:为一个CFHTTP请求创建一个可读流。

1.6 CFReadStreamCreateForStreamedHTTPRequest

功能:为一个HTTP请求的body保持在内存的CFHTTP请求创建一个可读流。

1.7  CFReadStreamCreateWithFTPURL

功能:创建一个FTP可读流

1.8  CFWriteStreamCreateWithFTPURL

功能:创建一个FTP可读流

2. CFReadStream接口

2.1  流的打开和关闭

      CFReadStreamOpen

      CFReadStreamClose

2.2 读取数据

     CFReadStreamRead

2.3. 调度一个可读流

       CFReadStreamScheduleWithRunLoop(_:_:_:)  

         CFReadStreamUnscheduleFromRunLoop(_:_:_:) 

2.4检查可读流的属性     

CFReadStreamCopyProperty(_:_:) 

CFReadStreamGetBuffer(_:_:_:)       

CFReadStreamCopyError(_:) 

CFReadStreamGetError(_:) 

CFReadStreamGetStatus(_:)     

CFReadStreamHasBytesAvailable(_:) 

2.5设置可读流的属性      

CFReadStreamSetClient(_:_:_:_:)

CFReadStreamSetProperty(_:_:_:) 

 2.6得到 CFReadStream的Type ID

                  CFReadStreamGetTypeID()             

3.CFWriteStream 相关接口

     3.1 CFWriteStreamClose(_:)

     3.2 CFWriteStreamOpen(_:) 

     3.3 CFWriteStreamWrite(_:_:_:)

              3.4 CFWriteStreamScheduleWithRunLoop(_:_:_:)

               3.5 CFWriteStreamUnscheduleFromRunLoop(_:_:_:)

              3.6 CFWriteStreamCanAcceptBytes(_:)

      3.7 CFWriteStreamCopyProperty(_:_:)

      3.8 CFWriteStreamCopyError(_:)

      3.9 CFWriteStreamGetError(_:)

      3.10CFWriteStreamGetStatus(_:) 

               3.11 CFWriteStreamSetClient(_:_:_:_:)

      3.12CFWriteStreamSetProperty(_:_:_:) 

      3.13 CFWriteStreamGetTypeID()

CFStream API的使用步骤:

1) 利用流创建接口创建相关流;

2)、调用CFReadStreamSetClient(可读流)或CFWriteStreamSetClient (可写流)来登记要接收的流相关的事件;

3)、调用CFReadStreamScheduleWithRunLoop(可读流)或CFWriteStreamScheduleWithRunLoop(可写流)来使在流在一个run loop上进行调度以便接收相关事件;

4)、调用CFReadStreamOpen 或CFWriteStreamOpen 来打开已创建的流;

5)、在读取流的创建时登记的回调中,在接收到kCFStreamEventHasBytesAvailable事件时来读取数据, 在可写流已登记的回调中,在接收到kCFStreamEventCanAcceptBytes事件时开始发送数据或请求;

6)数据传输完成,关闭和释放打开和创建的相关流;

2、NSStream   API的使用

 在ios 中由于NSStream类不支持与一个远程主机连接,而CFStream支持,因此为了使用NSStream,你需要使用流创建函数CFStreamCreatePairWithSocketToHost或CFStreamCreatePairWithSocketToCFHost来打开一个与远程主机连接的socket并分配一对CFStream对象(CFReadStream和CFWriteStream),并cast这些对象到NSStream对象(对应NSInputStream 和 NSOutputStream)。从而可以使用NSStream类的相关接口进行相关网络编程。如设置接收网络事件的代理对象,调度到当前的run loop,然后打开它们进行相应处理。

代码片段如下:

[objc] view plaincopy

1.  {  

2.    

3.          NSURL *website = [NSURL URLWithString:urlStr];  

4.    

5.          if (!website) {  

6.    

7.              NSLog(@"%@ is not a valid URL");  

8.    

9.              return;  

10.   

11.         }  

12.   

13.         CFReadStreamRef readStream;  

14.   

15.         CFWriteStreamRef writeStream;  

16.   

17.         CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)[website host], 80, &readStream, &writeStream);  

18.   

19.         NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream;  

20.   

21.         NSOutputStream *outputStream = (__bridge_transfer NSOutputStream *)writeStream;  

22.   

23.         [inputStream setDelegate:self];  

24.   

25.         [outputStream setDelegate:self];  

26.   

27.         [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];  

28.   

29.         [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];  

30.   

31.         [inputStream open];  

32.   

33.         [outputStream open];  

34.   

35.   

36.         /* Store a reference to the input and output streams so that 

37.  

38.            they don't go away.... */  

39.   

40.         ...  

41.   

42. }  

       在NSStream对象打开后,当接收到相关的stream-event网络消息,其代理对象中的handleEvent: 函数被调用,从而进行流相关的网络消息处理,  如发送相关协议的请求或接收应答等。以下为handleEvent: 函数进行事件处理的代码片段:

   

[objc] view plaincopy

1.  - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {  

2.    

3.      NSLog(@"stream:handleEvent: is invoked...");  

4.    

5.     

6.    

7.      switch(eventCode) {  

8.    

9.          case NSStreamEventHasSpaceAvailable:  

10.   

11.         {  

12.   

13.             if (stream == oStream) {  

14.   

15.                 NSString * str = [NSString stringWithFormat:  

16.   

17.                     @"GET / HTTP/1.0\r\n\r\n"];  

18.   

19.                 const uint8_t * rawstring =  

20.   

21.                     (const uint8_t *)[str UTF8String];  

22.   

23.                 [oStream write:rawstring maxLength:strlen(rawstring)];  

24.   

25.                 [oStream close];  

26.   

27.             }  

28.   

29.             break;  

30.   

31.         }  

32.   

33.         // continued ...  

34.   

35.     }  

36.   

37. }  

 

三、url编程模式

        url 编程模式通过URL的方式来实现网络编程,任何要存取的网络资源(包括局域网和广域网)都可以用一个URL来表示和存取,并支持设备间的资源共享。url 编程模式系统提供http,https, file, ftp, data等五种协议支持,并允许用户自己开发和登记相关类来支持另外的应用层网络协议,进行协议的扩展。

       url 编程模式在IOS系统可以使用两种编程接口:NSURLSession 和NSURLConnection。

       对于iOS7 以后的最新系统推荐使用NSURLSessionAPI,对于老版本由于不支持NSURLSession,因此必须使用NSURLConnection API。

       NSURLSession编程模式是对相关的连接请求通过一个会话来完成,应用通过创建一系列sessions来实现网络通讯,每一个session协调一组相关数据的传输任务。在每一个session内,应用添加一系列任务,每一个任务表现一个特定URL 请求。

       NSURLSession相比NSURLConnection的优点是支持在应用挂起、停止或crashed时能够在后台继续下载数据,即支持任务的取消、重启(恢复)、挂起,以及支持从已挂起、取消或失败的下载中重新恢复下载的能力。

        对于简单的请求,还可以直接通过一个简单的NSURL对象来发出请求,并使用一个NSData内存对象或者一个文件的方式来引出NSURL指向的内容。而NSURLConnection API只能通过构造一个NSURLRequest对象或其子类来发出URL请求来请求下载或上传URL数据。使用一个NSURLRequest请求对象封装一个URL请求,例如HTTP协议方法,除了可以封装一些协议特定的属性外,还可以规定任意本地cached数据的使用策略。

        对于NSURLRequest请求对象的应答包括两部分:描述内容的元数据metadata及内容数据本身。两种API对于使用NSURLRequest请求接收的元数据metadata都由NSURLResponse类来封装,其中包含MIME类型、内容长度、编码及提供应答的URL等内容。NSURLResponse协议特定的子类还能提供额外的元数据,如NSHTTPURLResponse提供协议头和WEB服务器返回的状态码 等信息。

        NSURLSession API的使用:

        NSURLSession类支持三种会话类型(默认会话类型、临时会话、后台会话)以及三种类型的任务(数据任务、下载任务、上传任务)。

        数据任务使用NSData对象来发送和接收内存数据,不存储数据到一个文件,因此不支持后台会话。

        下载任务以一个文件的形式引出数据,并支持在应用没有运行时的后台下载。

        上传任务用来上传数据(文件),也能够支持应用没有运行时的后台上传。

         默认会话和后台会话的区别是后台会话使用一个分离的进程处理所有的数据传输任务,并带有一些限制:后台会话必须使用特定应用代理来提供事件提交,并仅支持HTTP和HTTPS协议,不支持其它定制协议,并仅支持上传和下载任务,不支持数据任务。

        临时会话不存储任何数据到磁盘,所有接收的内容都保存到与会话关联的RAM中,当会话无效时,RAM中接收的内容自动被清除。

  NSURLSession API的使用步骤:

  1 、创建一个NSURLSessionConfiguration配置对象

NSURLSessionConfiguration配置对象提供广泛的配置选项,包括:

1)、特定于单个会话的私有数据存储,包括caches, cookies, credentials, 和protocols;

2)、与一个特定请求或一个会话关联的Authentication;

3)、与一个主机的最大连接数;

4)、与一个资源关联的超时;

5)、最小和最大TLS版本支持;

6)、定制的代理词典;

7)、cookie策略的控制;

8)、HTTP pipelining行为的控制

2、根据配置创建相应的NSURLSession;

      如下代码片段展示了根据不同的配置对象创建不同类型的NSURLSession会话对象。

         

[objc] view plaincopy

1.  /* Create a session for each configurations. */  

2.      self.defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];  

3.      self.backgroundSession = [NSURLSession sessionWithConfiguration: backgroundConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];  

4.      self.ephemeralSession = [NSURLSession sessionWithConfiguration: ephemeralConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];  

 

      NSURLSession API通过代理来实现异步URL内容存取,代理可以是系统提供的代理,还可以是应用提供的特定代理对象。任务对象当从服务器接收到数据或传输完成时调用这些代理对象的方法。

    在创建会话指定相应的代理对象。

3、为会话添加任务;

使用如下方法来添加数据任务到一个会话。

dataTaskWithURL(_:)

dataTaskWithURL(_:completionHandler:)

dataTaskWithRequest(_:)  

dataTaskWithRequest(_:completionHandler:) 

    

使用如下方法来添加下载任务到一个会话。

downloadTaskWithURL(_:)

downloadTaskWithURL(_:completionHandler:) 

downloadTaskWithRequest(_:) 

downloadTaskWithRequest(_:completionHandler:) 

downloadTaskWithResumeData(_:) 

downloadTaskWithResumeData(_:completionHandler:) 

 

使用如下方法来添加上传任务到一个会话

uploadTaskWithRequest(_:fromData:)

uploadTaskWithRequest(_:fromData:completionHandler:) 

uploadTaskWithRequest(_:fromFile:)

uploadTaskWithRequest(_:fromFile:completionHandler:)

uploadTaskWithStreamedRequest(_:) 

        如下是数据任务创建代码片段:     

[objc] view plaincopy

1.  NSURL *url = [NSURL URLWithString: @"http://www.example.com/"];  

2.    

3.  NSURLSessionDataTask *dataTask = [self.defaultSession dataTaskWithURL: url];  

4.    

5.  [dataTask resume];  

      下面是下载任务创建代码片段:         

[objc] view plaincopy

1.  NSURL *url = [NSURL URLWithString: @"https://developer.apple.com/library/ios/documentation/Cocoa/Reference/"  

2.    

3.                "Foundation/ObjC_classic/FoundationObjC.pdf"];  

4.    

5.  NSURLSessionDownloadTask *downloadTask = [self.backgroundSession downloadTaskWithURL: url];  

6.    

7.  [downloadTask resume];  

4、使用代理方法接收数据及状态信息

 

会话的数据任务在使用应用特定代理接收数据时必须实现如下两个代理方法:

URLSession:dataTask:didReceiveData: 

一次一片的提供请求的数据给会话任务。

URLSession:task:didCompleteWithError:

指示请求数据已经全部接收。

 

会话的下载任务在下载文件时应该实现如下代理方法:

URLSession:downloadTask:didFinishDownloadingToURL:

下载内容存储到一个URL指定的一个临时文件,在该方法返回之前,必须把临时文件的内容移到一个永久位置,而临时文件被删除。

URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite: 

为应用提供关于当前下载进度的状态信息

URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:

告诉应用已经从从先前的失败下载中恢复。

URLSession:task:didCompleteWithError: 

告诉应用下载已经失败。

 

下载失败恢复处理:

在应用使用cancelByProducingResumeData: 方法取消下载任务时,可以使用downloadTaskWithResumeData: 或 downloadTaskWithResumeData:completionHandler:方法重新创建一个新下载任务并传送cancelByProducingResumeData:产生的恢复数据从而接着继续下载。

在传输失败时,如果任务可恢复,则调用URLSession:task:didCompleteWithError: 方法。在传送给URLSession:task:didCompleteWithError: 方法的参数NSError中的userInfo 词典中包含键值为NSURLSessionDownloadTaskResumeData的恢复数据,因此可以使用downloadTaskWithResumeData: 或 downloadTaskWithResumeData:completionHandler:方法重新创建一个新下载任务来接着恢复数据继续下载。

 

系统代理仅能支持基本的URL资源存取任务,不支持认证和后台下载,并且还必须提供一个completion handler block来把返回的URL数据提交到应用。如下是一个使用系统代理的代码例子:         

[objc] view plaincopy

1.  NSURLSession *delegateFreeSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];  

2.    

3.  [delegateFreeSession dataTaskWithURL: [NSURL URLWithString: @"http://www.example.com/"]  

4.    

5.                    completionHandler:^(NSData *data, NSURLResponse *response,  

6.    

7.                                        NSError *error) {  

8.    

9.                        NSLog(@"Got response %@ with error %@.\n", response, error);  

10.   

11.                       NSLog(@"DATA:\n%@\nEND DATA\n",  

12.   

13.                             [[NSString alloc] initWithData: data  

14.   

15.                                     encoding: NSUTF8StringEncoding]);  

16.   

17.                   }] resume];  

          会话的上传任务的任务创建和相关代理方法:

          会话的上传任务使用HTTP  POST方法来上传数据。可以以一个NSData对象、一个文件或使用一个流为HTTP POST请求的body提供内容。

          在以NSData对象提供上传数据时,应用调用uploadTaskWithRequest:fromData: 或uploadTaskWithRequest:fromData:completionHandler: 方法来创建上传任务。

在以文件形式提供上传数据时,应用调用uploadTaskWithRequest:fromFile: 或 uploadTaskWithRequest:fromFile:completionHandler:方法来创建上传任务

在以流方式提供上传数据时,应用调用uploadTaskWithStreamedRequest:方法来创建上传任务。

应用特定代理可以通过实现URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:方法来获得上传进度信息。

 

 

把注释掉的代码删除掉:在 SAP ABAP 团队里打造可回溯、可测试、可演进的代码库 摘要 SAP ABAP项目中常见的"注释掉代码"反模式存在严重隐患:它增加代码噪音,制造虚假安全感,并可能引发安全和合规风险。Clean ABAP指南明确建议删除这类代码,理由包括: 版本控制系统已提供完整历史回溯能力 注释代码会误导开发者,增加理解成本 临时禁用需求应通过Feature Toggle实现 必须保留的参考代码应放入$TMP等隔离区域 团队应建立自动化检查机制,将"删除注释代码"纳入工程规范,确保代码库只表达当前有效的行为逻辑。在AI时代,可以利用工具辅 阅读详情

相关推荐

运动目标成像必学:5分钟搞懂keystone变换原理与避坑指南

本文深入浅出地解析了雷达信号处理中的Keystone变换原理,它是解决运动目标距离徙动问题的关键技术。文章通过直观比喻和简化公式,阐述了该变换如何通过变量代换实现距离与慢时间的解耦合,将倾斜轨迹“掰直”,从而提升成像与检测性能。同时,文中重点指出了实际应用中关于大速度场景、插值误差、多目标处理及高阶运动补偿等关键避坑点,为工程实践提供了宝贵指南。

ios99的博客 403

Stream 编程模式

stream编程模式提供了与 unix 的文件操作类似的模式。首先创建和设置流,接着打开流,然后读写流,在流存在时还可以通过查询流的相关属性来读取流的相关信息,在流使用完毕后关闭流。        iOS 为stream编程模式提供的api编程接口包括两大类,一类是Core Foundation框架层用C语言实现的CFStream  API(包括CFStream、 CFReadStream

Spriteluo的专栏 1687

AXI总线的Burst Type以及地址计算 | WRAP到底是怎么一回事?

AXI总线的transaction是burst-based的,因此有必要好好研究一下不同burst type的工作原理。此处略过burst的定义以及burst size、burst length等信号的介绍。

qiuzhongyu123的博客 2万+

NSStream创建Socket连接

定义变量 //定义变量 NSInputStream *inputStream; //数据从文件/设备到app内存叫做input stream NSOutputStream *outputStream; //数据从app 内存到文件/设备叫做output stream CFReadStreamRef readStream; CFWriteStreamRef wr...

auspark的专栏 606

PyMOL下载安装教程(附安装包)2025最新版(PyMOL 3.0.3)

本文详细介绍了Windows系统下PyMOL分子建模软件的安装教程。主要内容包括:提供安装包下载链接,强调需关闭杀毒软件;分步骤讲解管理员身份运行安装程序、接受协议、选择安装路径等安装流程;重点说明如何配置隐藏文件夹ProgramData中的许可证文件;最后提供基础使用技巧和常见问题解决方案。该教程适用于需要制作高质量分子结构图的科研人员和新手用户,帮助完成软件部署并顺利开展工作。

progalchemist的博客 3786

通信工程学习:什么是ASK振幅键控、FSK频移键控、PSK相移键控

ASK、FSK和PSK是三种基础数字调制技术。ASK通过改变载波振幅传输信息,实现简单但抗干扰弱;FSK利用频率变化传递信号,抗干扰较强但频谱利用率一般;PSK通过相位变化编码数据,抗干扰和频谱效率最优但同步要求高。三种技术各具特点,分别适用于不同通信场景:ASK用于低速光纤通信,FSK常见于无线广播,PSK则广泛应用于Wi-Fi、蓝牙等现代通信系统。

limengshi138392的博客 8717

(六十四)iOS的socket实现(C+OC混合实现)

对于微博、微信朋友圈之类的网络通信,使用JSON完全可以满足需求,但是如果要制作网络游戏,就需要建立一个持久连接,这时候就要考虑使用socket。 在iOS上实现socket大体有两种方法,一是借助自带的输入输出流和C语言socket相结合,二是利用第三方类库CocoaAsyncSocket,本文将介绍前者,在下一篇文章中介绍基于第三方类库的实现方法。 要调试socket,首先应该有一...

weixin_30809333的博客 210

ArcGIS Pro中文帮助离线包安装指南:版本匹配与操作详解

本文详细指导如何为ArcGIS Pro安装中文帮助离线包,解决在线帮助访问不畅的问题。核心在于确保软件版本与离线包的精确匹配,并提供了从版本查看、离线包获取、安装步骤到软件内配置的完整操作流程。文中重点强调了版本匹配的重要性,并分享了高效使用本地帮助搜索及管理多版本帮助的实用技巧。

whisky的博客 989

Socket连接两种实现方式:CFStream和GCDAsyncSocket(xmpp)

CFStream实现socket 1,利用CFStream建立socket连接:(CF = CoreFoundation) 建立连接的基本设置并设置代理,通过代理进行监听: //1,通过Stream创建Socket对连接到主机,第一个值CFAllocatorRef alloc传NULL,可以默认分配内存 //五个参数分别是:分配空间,主机,端口号,输入流,输出流 NS...

auspark的专栏 1148

华硕三频万兆分布式路由组网实战:从AiMesh 2.0到全屋Wi-Fi 6覆盖

Mesh组网是解决大户型Wi-Fi覆盖难题的主流方案,其核心原理是通过多个节点构建网状网络,实现设备间的无缝漫游。在技术层面,Wi-Fi 6标准、三频设计(包括专属回程频段)和有线回程等技术,共同提升了网络的带宽、稳定性和抗干扰能力。这些技术的工程价值在于,能够为多设备并发、高带宽应用(如4K/8K流媒体、在线游戏、内网文件高速传输)提供可靠支撑。具体到应用场景,例如利用华硕AiMesh 2.0系统,配合三频万兆分布式路由器,可以实现智能的设备连接与负载均衡。通过合理规划节点位置、优先采用有线回程,并进行Q

weixin_34054866的博客 431

AI实时盯盘与素材更新迭代功能开发——千川素材投流系统完全指南

《AI驱动的千川素材投流系统完全指南》摘要 本文针对抖音电商生态中巨量千川平台的素材投放挑战,提出了一套AI驱动的实时盯盘与素材更新迭代解决方案。系统通过分层架构设计,整合数据采集、实时监控、AI分析和自动化执行模块,实现分钟级数据追踪与智能决策。核心功能包括实时数据采集、异常检测、自动化投放调整和素材生命周期管理,有效解决人工盯盘效率低、素材生命周期短、决策响应慢等痛点。系统采用Python+FastAPI技术栈,结合机器学习和自动化工具,提供从数据采集到决策执行的全链路解决方案,帮助商家提升投放效率和R

huanghm88的专栏 228

iOS 网络编程模式总结

IOS 可以采用三类api 接口进行网络编程,根据抽象层次从低到高分别为socket方式、stream方式、url 方式。一 、socket 方式IOS 提供的socket 方式的网络编程接口为CFSocket,CFSocket是BSD sockets的抽象和封装,CFSocket提供BSD sockets几乎所有的功能,并集成socket进run loop,用来实现多线程网络编程和网络事件监听。

固弘的专栏 1万+

泛微OA自定义post接口和路径(无侵入)

泛微OA自定义post接口和路径(无侵入)

技术分享 3868

iOS 网络编程模式总结

IOS 可以采用三类api 接口进行网络编程,根据抽象层次从低到高分别为socket方式、stream方式、url 方式。 一 、socket 方式 IOS 提供的socket 方式的网络编程接口为CFSocket。CFSocket是BSD sockets的抽象和封装,CFSocket提供BSD sockets几乎所有的功能,并与run loop集成,用来实现多线程网络编程和网络事件监

fghydx的专栏 719

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

[深入浅出Cocoa]iOS网络编程之Socket

一,iOS网络编程层次模型 在前文《深入浅出Cocoa之Bonjour网络编程》中我介绍了如何在Mac系统下进行 Bonjour 编程,在那篇文章中也介绍过 Cocoa 中网络编程层次结构分为三层,虽然那篇演示的是 Mac 系统的例子,其实对ios系统来说也是一样的。iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKitCore

fishmai的专栏 2216

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

ios调用unix 网络编程的socket 接口实行UDP通信, 锁屏后解屏会闪退的解决方法

原因:IOS 锁屏,然后解屏后,会发出一个SIGPIPE 信号,大家都知道,系统默认收到该信号,进程退出的。 解决: 方法1:signal( SIGPIPE, SIG_IGN ); 该方法不知道为什么,在IOS 真机下跑,无法捕捉SIGPIPE; 方法2:setsockopt( nSocket, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, size

梁桥江的专栏 1433

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

UIday1601:网络编程 GET POST 的同步或异步请求,服务器接口的简单介绍。

网络编程 GET POST 的同步或异步请求,服务器接口的简单介绍。

tiebanshao的博客 620

ios网络编程网络接口里边含有汉字不能转换成NSURL并且调试显示为空

NSString *url =[NSString stringWithFormat:@"http://v.juhe.cn/weather/forecast3h.php?cityname=%@key=57e5f0dfe71c559fa3df5dc246c45922",cityname];          [networkSan getSanDataWithURL:[url stringByAd

学无止境 832

iOS:网络编程模式

IOS 可以采用三类api 接口进行网络编程,根据抽象层次从低到高分别为socket方式、stream方式、url 方式。 一 、socket 方式        IOS 提供的socket 方式的网络编程接口为CFSocket。CFSocket是BSD sockets的抽象和封装,CFSocket提供BSD sockets几乎所有的功能,并与run loop集成,用来实现多线程网络编程和网络

_understand的博客 686
上一篇: KVC基本使用
下一篇: iOS网络开发编程之NSURLConnection详解 iOS网络层常用的库如ASIHTTPRequest,AFNetworking,MKNetworkKit等知名的第三方库。随着ASI不再更新,楼主
hsf_study
博客等级 码龄11年 10粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值