默认
发表评论 12
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
求助关于 ios 上 AsyncSocket 粘包问题的处理
阅读(40018) | 评论(12 收藏 淘帖
-(void)onSocketAsyncSocket *)sock didReadDataNSData *)data withTaglong)tag  ios asyncSocket接收到的消息 出现粘包    服务器的消息定义是 107  自定义数字  消息长度   消息体    有时候会出现粘包把下一个包的的107 读出来 粘在上一个包里  导致后面消息没法解读  请问怎么解决 有大神贴份 asyncSocket的粘包处理代码吗

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

标签:网络编程
上一篇:不为人知的网络编程(三):关闭TCP连接时为什么会TIME_WAIT、CLOSE_WAIT下一篇:不为人知的网络编程(四):深入研究分析TCP的异常关闭
推荐方案
评论 12
TCP协议的粘包问题很常见,你百度一下找个例子用下就好了。
引用:JackJiang 发表于 2017-09-01 16:12
TCP协议的粘包问题很常见,你百度一下找个例子用下就好了。

找了很久  都不合适
引用:JackJiang 发表于 2017-09-01 16:12
TCP协议的粘包问题很常见,你百度一下找个例子用下就好了。

找了很久  都没找到合适的
引用:这不是马甲 发表于 2017-09-01 18:33
找了很久  都没找到合适的

ios上我没有粘包的代码可以给你参考。实在找不到的话,你可以找个c++或java的,理解一下用OC实现一下就好了,解决粘包其实是个思路而已,代码并不难实现。
引用:JackJiang 发表于 2017-09-01 18:59
ios上我没有粘包的 代码可以给你参考。实在找不到的话,你可以找个c++或java的,理解一下用OC实现一下就 ...

我遇到个问题  就是有nadata数据 但是没法转成nsstring  这个是什么原因
引用:这不是马甲 发表于 2017-09-05 08:55
我遇到个问题  就是有nadata数据 但是没法转成nsstring  这个是什么原因

肯定可以转的,但你说的问题应该转后变乱码吧
这是我的粘包处理部分. 添加了头和尾部 _mutalbeData 是一个全局的NSMutableData. 因为是异步的加了锁. 看看是否能帮到你
- (NSInteger)packData:(NSData *)datas {
    if (datas.length < kDSPersonHeaderString.length + 4 + 4) {
        return 1;
    }
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    [self.mutalbeData appendData:datas];
    dispatch_semaphore_signal(semaphore);
    NSString *string = [[NSString alloc] initWithData:_mutalbeData encoding:NSUTF8StringEncoding];
    NSArray *stringArr = [string componentsSeparatedByString:kDSpersonEndString];
    NSMutableArray *usefulStringArr = [NSMutableArray new];
    int count = 0;//用来判断此次是否读取完毕
    for (NSString *str in stringArr) {
        if ([str hasPrefix:kDSPersonHeaderString] && [str hasSuffix:@"}"]) {//判读他是json类型,
            NSString *new = [str substringWithRange:NSMakeRange(kDSPersonHeaderString.length + 4, str.length - (kDSPersonHeaderString.length + 4))];
            NSData *data = [new dataUsingEncoding:NSUTF8StringEncoding];
            id content = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
            if (content) {
                //dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
                [DSpersonToolKits unpackWithDic:content waitToSendArray:_allData lengthData:[datas subdataWithRange:NSMakeRange(kDSPersonHeaderString.length, 4)]];
               // dispatch_semaphore_signal(semaphore);
                
            }
            [usefulStringArr addObject:new];
        }else if (str.length != 0){
            NSData *strData = [str dataUsingEncoding:NSUTF8StringEncoding];
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
            _mutalbeData = strData.mutableCopy;
            dispatch_semaphore_signal(semaphore);
            count ++;
        }
    }
    if (count == 0) {
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        _mutalbeData = [NSMutableData data];
        dispatch_semaphore_signal(semaphore);
    }
    
    return count;
}
居然有表情  第一个表情改为(
第二个表情删除
引用:JackJiang 发表于 2017-09-05 10:06
肯定可以转的,但你说的问题应该转后变乱码吧

打印出来是null
引用:这不是马甲 发表于 2017-09-06 09:49
打印出来是null

那就直接把2进制抓出来分析。
MobileIMSDK  有处理 粘包问题吗?
引用:cgxing_X7iF1 发表于 2018-04-04 10:52
MobileIMSDK  有处理 粘包问题吗?

UDP不存在粘包这种情况
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部