博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OC-socket使用介绍
阅读量:6182 次
发布时间:2019-06-21

本文共 3453 字,大约阅读时间需要 11 分钟。

  socket技术常用于即时通讯,断断续续的网络链接,比如断点上传等。目录:

  一、环境准备

  二、客户端

  (一)建立连接

  (二)数据收发

  三、服务器端

  (一)建立连接

  (二)接收数据

/************************************************************************************************/

  一、环境准备

    本文的socket介绍基于git上的第三方库类CocoaAsyncSocket ,目前作者已经更新到 7.4.2版本。git下载地址是:

        https://github.com/robbiehanson/CocoaAsyncSocket.git

       下载好之后,将RunLoop文件夹下的AsyncSocket.h, AsyncSocket.m, AsyncUdpSocket.h, AsyncUdpSocket.m 文件拷贝到我们的项目中来。

    添加CFNetwork.framework框架。

    在用到socket的文件中引入头文件:

#import <sys/socket.h>

#import <netinet/in.h>

#import <arpa/inet.h>

#import <unistd.h>

#import "AsyncSocket.h"

#import "AsyncUdpSocket.h"

 

  二、客户端

  (一)建立连接

   1、首先初始化,并主动连接服务端。

//初始化socket,并设置本controller为代理, self.socketClient=[[AsyncSocket alloc]initWithDelegate:self];NSError *error = nil; //连接服务器,withTimeout:5 ,意思是超过5秒还没有连通的话,就算是连接失败,调用连接失败的代理方法[self.socketClient connectToHost:self.socketHost onPort:self.socketPort withTimeout:5 error:&error];

   并且遵守代理协议

@interface ViewController ()<AsyncSocketDelegate,AsyncUdpSocketDelegate>

 

  2.1、如果上面的socketClient连接成功,就会调用代理方法

/** *   成功连接服务器时调用 */-(void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{    NSLog(@"链接成功!");}

  2.2、如果上面的socketClient连接失败,就会调用代理方法

/** *  连接失败,或断开连接时会调用 */-(void)onSocketDidDisconnect:(AsyncSocket *)sock{    NSLog(@"连接失败,连接断开!可以在这里调用重新连接的方法"); //可以将下面这个方法提出来重写一个方法,进行封装,方便调用 //在实际开发中,还要定义标记来判断是服务器掉线,还是用户主动断掉连接的 //[self.socketClient connectToHost:self.socketHost onPort:self.socketPort withTimeout:5 error:&error];

  (二)数据收发

    1、接收数据

      如果连接成功,就可以接收数据了,当接收到数据就会调用如下方法:

/** *  当接收数据的时候就会调用 */-(void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{//    读取数据,当timeout为负数的时候,不设定超时时限    [self.socketClient readDataToData:data withTimeout:-1 tag:1]; //如果数据分多次接收,那么,可以在这里拼接data数据,并计算已经接收的数据长度,或者对数据进行持续写入操作,保证大文件下载不占用过多内存}

 

  2、发送数据

   当socket连接成功,在上述中的

-(void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port 方法中,准备好data数据,并且调用方法 [self.socketClient writeData:fileData withTimeout:-1 tag:1]; 即:
-(void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{    NSLog(@"链接成功!");    //    准备要上传的数据,转换为data    NSData * fileData=[NSData dataWithContentsOfFile:@"文件路径"];    //   调用socket的发送数据方法    [self.socketClient writeData:fileData withTimeout:5 tag:1];}

 

  如果数据上传成功,就会调用代理方法:

/** *  发送数据成功时调用 */-(void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag{    NSLog(@"上传成功!");}

  如果上传或者下载失败,那么就说明连接断了,期间会调用 onSocketDidDisconnect: 方法,在该方法中编写有关的处理代码即可。

  三、服务器端

  (一)建立连接

    为了代码举例方便,假设在服务器端就在app中,那么在viewcontroller中进行代码编写。

- (void)viewDidLoad {    [super viewDidLoad];//    初始化,并设置代理    self.socketServer=[[AsyncSocket alloc]initWithDelegate:self];    //    设置对应的端口号(监听这个端口收到的信息)    [self.socketServer acceptOnPort:8080 error:nil];}

  当接收到新的socket

/** *  当接收到新的socket的时候调用 */-(void)onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket{//    获取新收到的socket    self.socketNewAcce=newSocket;}

 

/** *  服务器端连通客户端,就会调用,方法名和客户端的一样 */-(void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port{    NSLog(@"与客户端连通!");//    连通后的有关操作,接收数据等  }/** *  与客户端断开连接的时候调用 */-(void)onSocketDidDisconnect:(AsyncSocket *)sock{
    NSLog(@"与客户端断开连接!");
}

 

  (二)接收数据

  接收数据只需要在服务器与客户端连通的代理方法中编写即可,

-(void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port。

 

转载于:https://www.cnblogs.com/panyuluoye/p/4911039.html

你可能感兴趣的文章
学编程学IT教程之ArrayList
查看>>
子元素滚动,父元素不滚动
查看>>
mysql实现随机查询
查看>>
Command Patern
查看>>
Spring MVC 异构响应
查看>>
Linux 文件目录
查看>>
Android studio style 提示主题样式找不到
查看>>
Android音频开发(6):使用 OpenSL ES API(上)
查看>>
关闭ESXi https的欢迎页面,增强服务器的安全。
查看>>
获取请求主机IP地址IPUtil
查看>>
Angular.js 不错的东西
查看>>
一凌网:未来10年SAAS模式管理软件将占领主要市场
查看>>
ERP效益评估方法-如何获取更多价值
查看>>
IDEA 修改Import 不是improt* 为单独import
查看>>
深入解析Java对象的hashCode和hashCode在HashMap的底层数据结构的应用
查看>>
写一个函数,算出两个文件的相对路径的
查看>>
JAVA字符串占位符替换
查看>>
滴滴天使投资人的25条创业建议
查看>>
MD5
查看>>
Android中的ContentProvider和ContentResolver
查看>>