写篇博客,在我项目中用到了一个很重要的第三方---AsyncSocket,写下我对AsyncSocket使用心得。我的项目中是APP对硬件直接交互,APP对硬件发指令的时候不需要经过服务端,要经过采集端,此处我要感谢曾在北京天一众合java工程师杜强(此交互中担任采集工程师)。

  1. AsyncSocket是一种很底层的数据交互控件,主要以拼接字节流来完成之间的数据传递,大家可能说字节流这东西如何拼接,是否操作很简单呢,其实我想告诉你,这对于技术大牛来说简单,对于初学者来说不见的容易得手。下面我先展现下文档。关于文档,有HTTP,TCP大家可能说TCP文档很少了解,那么我给你们展现下。

“下发即时音频”:

大家看到的这个文档就是TCP文档,首先我拿“下发即时音频”作为一个列子拿给大家讲。可以看出,信息头下面都有注明几个字节,信息头2个字节,长度2个字节,等等。在上面我就说过,这个要以拼接字节流来进行数据交互。所以字节流已经给注明。信息头不变,表示是什么指令,结束标志表示是该指令的结束。该指令中还有长度,序列号,控制命令,声音文件,这些正是你要拼接字节流的地方。那么我下面根据代码给详细讲解下。

这里我封装了一个方法,首先把10进制转化为16进制,然后再转化Ascll码,这里Byte head[] = {0x42,0x68};就是转化为Ascll后,拼接上。Byte serialNumbe[] = {0x00,0x01};为序列号, Byte controlCommand[] = {0x00,0x02};为控制命令。

 NSData * infoHeaderData = [NSData dataWithBytes:head length:2];转化为data类型。  NSInteger  totallength  =  2+2+Data.length ;其中此处的Data,就是声音文件,此处是加上声音文件的长度,但不是我们要的最终总长度。 NSMutableData *sendData = [[NSMutableData alloc] init];此处sendData是我们最终是拼接好的也是我们要的该指令的总长度。我在做此处的时候进制转化很繁琐。要把二进制转化为十进制,再转化为十六进制,再转化为Ascll码值,没有找到直接转化为十六进制的方法也许是我太过繁琐。我们对拼接字节流后是不是该进行交互了啊,下面我再对AsyncSocket怎么用进行详细讲解下。

AsyncSocket

1.首先要握手,就是连接Socket端口:self.socket = [[GCDAsyncSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
此处我选择调用子线程,因为交互时怕对线程造成影响,对语音发送到收到要求时间短,不能有延迟。然后就是连接端口,只要是TCP都会给你提供端口号:[self.socket connectToHost:@"hahahahaha" onPort:1234 error:nil];此处“hahahahaha”是你们的端口号,“1234”是你们端口号密码。然后再 self.socket.delegate = self;设置好委托。此处Socket以握手成功。
2.socket的回调方法:

-(void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
{
    
    [sock readDataWithTimeout:-1 tag:0];
    
    
    [sock readDataWithTimeout:-1 tag:1];

此处是你要写的拼接好的字节流指令。发送方法;注意要标注好tag值,以分清是第几个指令方便你后面收到回复执行事件
    
    
}
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag;
{
   

    NSLog(@" %ld 成功",tag);
    此处是你发送的指令是否成功;
    
}
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    
   
    
    [self.socket readDataWithTimeout:-1 tag:1];
    [self.socket readDataWithTimeout:-1 tag:0];

    此处是发送成功后调用次方法,根据返回值再执行事件;

 Byte byteTest;
    byteTest = [self getDataByteWithIndex:8 WithData:data];


}

此时返回值不是

//通过index获取data中的值
-(Byte) getDataByteWithIndex : (int) index WithData: (NSData *)data
{
    Byte byteTest = -1;
    if (data) {
        if (index < data.length) {
            NSRange range = {index, 1};
            [data getBytes:&byteTest range: range];
        }
    }
    return  byteTest;
}
此处我根据返回值如0000001000200;此处是十六制数,不是string类型的。我的要求是取出第几个数(如第8位数)

说道这里相信你对Socket已经有个大概的了解了我再给你一个指令较为复杂的TCP指令。

此处你要拼接的字节流有长度,序列号,控制命令,用户ID长度,用户,接受时间长度,接受时间,app版本号长度,app版本号,这里你共需要拼接9个字节流。都需要最终转化为Ascll,用户名也一样。您能拼接出来一个方法吗?下面我给展现下我封装这个指令的方法:

//下发到所有卡指令
-(NSData *)allaudiocard:(NSString *)name cardString:(NSString *)card version:(NSString *)String
{
    
    Byte head[] = {0x42,0x68};
    Byte serialNumbe[] = {0x00,0x01};
    //Byte controlCommand[] = MyAudio0x0001;
    Byte controlCommand[] = {0x00,0x01};
    //    NSString * idString = @"cxylmm";
    Byte end[] = {0xd,0xa};
    NSData * infoHeaderData = [NSData dataWithBytes:head length:2];
    NSData * serialNumberData = [NSData dataWithBytes:serialNumbe length:2];
    NSData * controlCommandData = [NSData dataWithBytes:controlCommand length:2];
    
    NSData *idData = [name dataUsingEncoding:NSUTF16BigEndianStringEncoding];
    NSInteger idLength = idData.length;
    Byte idLenByte[] ={0,0};
    idLenByte[0] =(idLength>>8) &0xFF;
    idLenByte[1] =idLength &0xFF;
    NSData * idLengthData = [NSData dataWithBytes:idLenByte length:2];
    
    NSDateFormatter * formate = [[NSDateFormatter alloc] init];
    [formate setDateFormat:@"yyyyMMddHHmmss"];
    NSString * dateString = [formate stringFromDate:[NSDate date]];
    NSData * dateData = [dateString dataUsingEncoding:NSUTF8StringEncoding];
    NSInteger datelength = [dateData length];
    Byte arr[] ={0, 0};
    arr[0] =(datelength>>8) &0xFF;
    arr[1] = datelength &0xFF;
    NSData * dateLengthData = [NSData dataWithBytes:arr length:2];
    
    //    NSString * appversion = @"1.2";
    NSData * appVersionData = [String dataUsingEncoding:NSASCIIStringEncoding];
    NSInteger appversonlength = appVersionData.length;
    
    Byte arra[] = {0 ,0};
    arra[0] =(appversonlength>>8) &0xFF;
    arra[1] = appversonlength &0xFF;
    
    NSData * appversionLengthData = [NSData dataWithBytes:arra length:2];
    
    //    NSString *cards = @"0210000000000369,0210000000000370";
    NSData *cardsData = [card dataUsingEncoding:NSASCIIStringEncoding];
    NSUInteger cardsnuberlength = [cardsData length];
    
    int  totallength  =  2+2+2+idLength+2+datelength+2+appversonlength+cardsnuberlength ;
    //    NSData * totalLengthData = [[NSString stringWithFormat:@"%d",totallength] dataUsingEncoding:NSUTF8StringEncoding];
    
    Byte totalByte[] = {0,0};
    totalByte[0] = (totallength >> 8) & 0xFF;
    totalByte[1] = totallength & 0xFF;
    NSData *totalLengthData = [NSData dataWithBytes:totalByte length:2];
    
    NSData * endData = [NSData dataWithBytes:end length:2];
    
    NSMutableData *sendData = [[NSMutableData alloc] init];
    [sendData appendData:infoHeaderData];
    [sendData appendData:totalLengthData];
    [sendData appendData:serialNumberData];
    [sendData appendData:controlCommandData];
    [sendData appendData:idLengthData];
    [sendData appendData:idData];
    [sendData appendData:dateLengthData];
    [sendData appendData:dateData];
    [sendData appendData:appversionLengthData];
    [sendData appendData:appVersionData];
    [sendData appendData:cardsData];
    [sendData appendData:endData];
    
    return [NSData dataWithData:sendData];

}
写到这里能明白吗?这就是AsyncSocket的用法,不过socket还有其他类型,不单单只有这一种。针对写。

关于AsyncSocket的更多相关文章

  1. IOS使用Asyncsocket进行socket编程

    iphone的标准推荐CFNetwork C库编程.但是编程比较烦躁.在其它OS往往用类来封装的对Socket函数的处理.比如MFC的CAsysncSocket.在iphone也有类似于开源项目.co ...

  2. IOS AsyncSocket

    导入AsyncSocket.h  AsyncSocket.m   AsyncUdpSocket.h   AsyncUdpSocket.m   以及  CFNetWork.framework async ...

  3. iOS socket编程 第三方库 AsyncSocket(GCDAsyncSocket)

    Socket描述了一个IP.端口对.它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通信的双发,即客户端(Clien ...

  4. AsyncSocket的使用

    AsyncSocket使用流程 安装AsyncSocket 拷贝AsyncSocket类到项目 使用AsyncSocket set delegate @interface NetWork : NSOb ...

  5. iOS_SN_Socket - AsyncSocket

    转载文章,原地址:http://yimouleng.com/2015/02/04/Socket-AsyncSocket/ 一.前言 公司的项目用到了Socket编程,之前在学习的过程当中,用到的更多的 ...

  6. AsyncSocket 使用

    今天使用AsyncSocket模拟及时通信,在这里记录一下,免得以后自己又犯相同的错误 1>创建客户端和服务器socket /** * 设置socket */ - (void)setupSock ...

  7. iOS开发之AsyncSocket使用教程

    用socket可以实现像QQ那样发送即时消息的功能.客户端和服务端需要建立长连接,在长连接的情况下,发送消息.客户端可以发送心跳包来检测长连接. 在iOS开发中使用socket,一般都是用第三方库As ...

  8. AsyncSocket的长连接使用

    使用背景:需要跟服务器长期保持连接进行即时通讯:还有在跟智能硬件建立实时链接进行同步智能硬件的状态等,最近我就做项目就碰到需要实时更新智能硬件的状态(比如智能硬件的电量,以及其它工作状态),跟智能硬件 ...

  9. AsyncSocket长连接棒包装问题解决

    project正在使用长连接快来server沟通.因此,指定我们的协议前两个字节为数据长度来区分数据包 app这边数据有两种传输形式: 1.app主动请求所须要的数据: 2.app异步接收来自服务端的 ...

  10. iOS开发之即时通讯之Socket(AsyncSocket)

    1.AsyncSocket介绍 如果需要在项目中像QQ微信一样做到即时通讯,必须使用socket通讯. iOS中Socket编程的方式: BSD Socket: BSD Socket 是UNIX系统中 ...

随机推荐

  1. css3的transform-origin配合scale,控制动画,实现各种hover效果

    1.底部画线,从左边开始,右边结束 html: <div class="silde-txt">底部划线</div> css: <style>.s ...

  2. 笨办法30Else 和 If

    people = 30 cars = 40 trucks = 30 if cars < people: print "We should take the cars." el ...

  3. CentOS7 linux下yum安装mysql5.7

    文章参考(https://www.cnblogs.com/jorzy/p/8455519.html) 1.创建存放安装包的位置,并且进入该目录 命令mkdir /share 命令cd /share 2 ...

  4. 浏览器输入URL按回车后都经历了什么?

    在浏览器上输入一个URL,按回车后,这个过程发生了什么? 1.首先,浏览器地址栏输入了URL,先解析URL,检测URL地址是否合法 2.浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直 ...

  5. python与sqlserver接口包pymssql

    包下载地址(对应着自己的电脑和Python的版本下载即可,我电脑是win32,Python是3.6的) https://pypi.python.org/pypi/pymssql/ 下载后我放到了d盘中 ...

  6. 关于Java的特点之多态

    多态--概念 所谓多态,就是指一个引用(类型)在不同情况下的多种状态.也可以理解成:多态是指通过指向父类的指针,来调用在不同子类中实现的方法. 实现多态有两种方式:1.继承:2.接口 多态--注意事项 ...

  7. webgl优化

    浏览器支持: Mozilla Firefox 42,Google Chrome 46,Apple Safari 9.0,MS Internet Explorer 11,MS Edge 13 Safar ...

  8. 复现 360 Unicorn Team 黑科技之 HackNFC

    看了2条360 Unicorn Team的微博后,感觉蛮有趣的,打算复现一下 谷歌了下相关资料,在HACKADAY找到了介绍文章 还有2篇北邮工学硕士的论文,欢迎有兴趣的朋友和我一起交流~ 联系方式在 ...

  9. wordpress搭建自己的博客~

    去官方网站下载wordpress,并解压缩.下载链接:https://cn.wordpress.org/ wordpress是一款开源的PHP框架,搭建个人博客网站最实用的选择之一,甚至你都不需要懂P ...

  10. 前台的url通过 ActionName?var1=xx&var2=yy 的形式传给特定action

    本文对自己开发的基于lucene和J2EE技术的搜索引擎开发经验进行简单总结.今后可能会从性能的角度总结lucene开发经验.当数据上TB级别后,分布式lucene以及结合分布式文件系统(如HDFS) ...