GCDAsyncSocket使用(ipv6适配)

作者: 绝雾迷城 | 来源:发表于2015-04-17 10:42 被阅读14461次

    在此之前发给链接关于socket ipv6的适配问题 https://github.com/robbiehanson/CocoaAsyncSocket/issues/405

    之前写的socket不怎么清晰,所以很多人过来咨询,打算重新再整理下。顺便把大家的问题总结下

    首先得大概了解TCP原理和UDP的一点区别!当然了我自己也是似懂非懂的状态,这些还是要靠自己慢慢摸索,多看看别人的blog见解,网上一搜一大把。GCDAsyncSocket是IOS中TCP通讯使用的一个第三方库。至于的它的什么三次握手啊这些网上多的很,我也不做过多的重复。下面就从demo开始吧!

    开始之前应该都能想到socket是贯穿整个项目使用,所以尽量提取出来,写成单例

    至于为何把connet方法提出来,主要是为了断开重连方便

    链接是否成功和命令是否发送成功的回调 delegate已经提供 我们只要调用方法就可以

    有心的童靴可以看到我在链接是否成功里面的 写了readDataWithTimeout的方法 其实是告诉socket你的超时时间

    链接成功后肯定要进行数据传输 这部分的各个项目的情况不一样 ,一般都不是单一的命令 所以我建议把具体的命令函数单独写成类  

    我这里是提出命令数据单独进行处理,可以给大家看看 当然每个公司的协议不同仅作参考

    最后就是接受数据的回调,

    在这里跟各位童靴说下 ,很多碰到这种问题 ,开始的时候能够接收到返回的数据 过来一会就不能,经常这种情况,我看了下 大家都是把timeout写成 10啊 30啊固定的时间,这里我和大家解释下,这个函数的意义,readDataWithTimeout  它底层相当于开了线程等待接收数据 过了这个时间 就自动停止,-1表示一直接收  。

    最后就是socket关闭的方法 DidClose DidDisconnect.

    这次更新就到这吧!谢谢!

    相关文章

      网友评论

      • 75724f2f1287:你好,我做的项目是用的UDP广播进行和硬件通讯,也遇到了您最后提到的那个问题,刚连接上热点能收到硬件返回的广播数据,过一会就不行了, 只有 1:另外开一个socket不停的广播无关的数据到局域网其他端口,或者 2:连续发送两次数据到局域网硬件端口,并且间隔必须在0.2秒左右,才能连续收到两次硬件返回的数据. 总的来说,就像手机收到了数据,但是没有进行回调,反而保存了起来,等下一次又有返回数据了,就连续回调两次,(已经关闭IPV6了)请问您知道这是为什么吗?:sweat_smile:
      • 12e6755290f5:我的连接成功以后,发送心跳包也是经常断开连接,这是怎么回事?
        12e6755290f5:@绝雾迷城 找到原因了,是因为我们服务器规定连接以后必须进行授权,否则会被认为是恶意请求而被服务器断开,我只是进行了连接而没有授权,所以才会经常断开,还是谢谢你,文章很有帮助。
        绝雾迷城:@雪域狼_d7d6 先确定你数据是否正确
      • Auditore:IPv6下链接失败
      • 47200923d724:楼主,请问我只是单一方面的接收服务器发来的数据,要怎样配置呢?
      • 我的时代我开创:麻烦问下 判断是否连接上 连接超时用的哪个啊?
        我的时代我开创:@绝雾迷城 好的 谢啦
        绝雾迷城:@我的时代我开创 didConnect 和didDisconnect
      • 没骆驼de祥子:楼主求demo
      • BoyXwj:想问一下博主。[self.tcpSocket readDataToLength:LENGHTH withTimeout:-1 tag:10]; 长度设置为多少能够获取完整数据。 就是完成一次连接。我设置为80,但是返回的数据还是不完整。超过80就没有返回值。TCP。求指点
        a983da717c55:文章写的不错,加你微信了一起学习
        BoyXwj:@绝雾迷城 我奇怪就奇怪在这个地方了。本身数据库返回的数据就不大。像这样。
        {
        "status": 1098,
        "msg": "服务器连接成功",
        "data": {
        "id": 1
        }
        }
        但是就是不完整,我都有点懵逼了。。。。
        绝雾迷城:@JasonKing 这个完整数据没有一个固定的值,最多是255个字节,如果你服务器返回数据长的话就需要分包
      • 迷恋代码:哥们,我现在做智能家居,需要TCP UDP这方面的知识, 之前没有接触过这方面的,可以给我发一份相关的Deme吗,拜托了🙏 492262370@qq.com,我顺便也加你微信,希望可以多多指导我
      • 逝风不名:哥们,能留个联系方式么,我现在工作也是智能家居,无从下手,能请教一下么
        绝雾迷城:@逝风不名 加我微信吧,yj864080214
      • 绝雾迷城:你怎么写的?
        Rhythm_Ting:@绝雾迷城_ 把哪段分开写呢?分开什么呢 ? :cold_sweat:
        绝雾迷城:@Rhythm_Ting 你这样不行的,分开写
        Rhythm_Ting:@绝雾迷城_ for 循环100次,在里面初始化GCDAsyncSocket ,然后调用connectToHost连接
      • 绝雾迷城:试过一个TCP和UDP同时运行接收数据是没问题的,你可以试试多几个TCP 单例 保持心跳包发送看看
        Rhythm_Ting:@绝雾迷城_ 我的意思是一个客户端开启多个长连接连同一个服务器,我这里的问题是开了第二个就会关闭前一个,只能保持一个长连接的心跳
      • Rhythm_Ting:请问如何开启多个TCP的长连接呢?可以开吗?
      • Liusr:Error Domain=GCDAsyncSocketErrorDomain Code=7 "Socket closed by remote peer" UserInfo={NSLocalizedDescription=Socket closed by remote peer

        这个您遇到过没.客户端报的错.连接总是不成功.能交流下吗
        Liusr:@绝雾迷城 嗯,我们这边服务器收到响应命令返回响应数据。我的命令给服务器发错了,就断开了。也没写心跳,断开就重新发命令去连接。目前没问题,谢谢你!
        绝雾迷城:@LiuRR 链接断开,你看看你心跳包
      • f3969479e601: GCDAsyncSocket在ipv6_only的环境下连接失败,怎么解决的?
      • ae945e473421:打开失败 求解 我的端口号不知道怎么做
        绝雾迷城:@忧蓝晴空 端口号是你们协议定
        绝雾迷城:端口号是你们服务器定的
      • 不管you多苦:我如何在连接成功的同时获取客户端的名称(手机名称)
      • 花前月下:做股票这种,需要实时链接的 怎么整?
        花前月下:@绝雾迷城_ 就比如说我就一个服务端就给了我一个获取实时行情的接口 http://www.xxx.com/realtime.json (随便写的), 那么我客户端需要做哪些准备工作或者是配置? 我调了这个方法 [_socket connectToUrl:url withTimeout:-1 error:&error];
        打印了这个 connect: No such file or directory
        表示刚开始研究。 望楼主赐教
        绝雾迷城:或者定时刷新数据
        绝雾迷城:@花前月下 通过推送,收到推送更新数据
      • c30ec7c7d234:文章不错, 成功点亮
        sea7reen:\r\n?
        c30ec7c7d234:@SuperHuihui123 有一个细节要注意一下, 需要在后面拼接\n结束消息的发送
      • smartHome:兄弟 我也在做智能家居。给个联系方式一起探讨下呗。
        iOS之星:@smartHome 兄弟 我也是做智能家居的 给个联系方式一起探讨下呗
        绝雾迷城:@smartHome 864080214qq
      • 千山i暮雪:请问不发送数据,接收服务器主动推送来的数据需要怎么配置吗
        绝雾迷城:@千山i暮雪 一般情况下,服务器是不会主动发送数据的,客户端发送数据服务器回复,如果你们确实有这种需求,先看下你们服务器采取哪种链接方式,再决定
      • 2d0164fcd940:请问,有Alamofire swift2.0版本的教程吗?就像这样子的,很简单的。

      本文标题:GCDAsyncSocket使用(ipv6适配)

      本文链接:https://www.haomeiwen.com/subject/efmgxttx.html