默认
发表评论 5
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
iOS 使用AsyncSocket + netty+protobuf做即时聊天遇难到问题
阅读(49986) | 评论(5 收藏 淘帖
1.最近在做即时聊天,不使用环信容云之类的,自己写
后台是使用 netty+protobuf 写的
2.我 iOS 端是使用 GCDAsyncSocket 写的
现在有几个问题:
     1.我自己使用 AsyncSocket  搭建一个即时聊天的服务器,在客户端进行连接,数据传输是使用 protobuf
我将一个 protobuf 的数据发送给服务器,服务器可以接收并且解析打印出来,当服务器接收到数据就是(NSData*)data 后我原封不动的 [socket writeData:data withTimeout:1 tag:1];发送给客户端;但是客户端在解析的时候就报错了
报错如下:
- (void) checkLastTagWasSInt32) value {
  
if (lastTag != value) {
   
@throw [NSException exceptionWithName:@"InvalidProtocolBuffer" reason:@"Invalid End Tag" userInfo:nil];
  }
}
打印如下
2===123===123===2===phoneUid: 123
userName: 123
userPwd: 123
phone: 123
appKind: 123
sessionId: 123
txId: 123
email: 123
userRole: 123
deviceId: 123

deviceType: 123
不知道这个是什么错,应该是数据结构的问题;还有在使用.proto文件生成 oc 文件的时候里面的参数好像会少一些;

第二个问题是:使用后台真正的 netty 时,我发送数据,他接受到数据的方法不再 read 里面而是在刷新里面,断开也不对,就是方法完全乱了
这又是怎么回事
表示对 netty 完全不知道是啥?
求大神解答

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

上一篇:环信的demo如何从消息列表跳转到单聊界面尼?下一篇:如果更新了聊天群成员的头像,怎么通知所有的群员?
推荐方案
评论 5
下次记得把问题排个版,现在看起来有点乱,但我还是看明白了。

我的建议是这样的:

1)开发初始,建议你不要一步到位直接用ProtoBuf这样的二进制协议:
没别的原因,就是不方便调试,你可以把这一块的代码封装一下,前期就用文本协议,后期等协议格式都确定后再切到ProfoBuf或MQTT都不会有问题。当然,这只是我的建议,你不这么做,也没什么问题。

2)关于iOS与netty服务端的跨平台通信数据有异常的问题:
我最近写了一个NIO入门系列文章,有一篇是《NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战》:http://www.52im.net/thread-378-1-1.html,你可以把源码下载下来运行看看,我仔细调试过,都是能正常运行和通信的,希望对你有帮助。
先排除跨平台通信的数据解析是否有问题,再去考虑是否Protobuf的问题,两个问题混在一起就容易搞蒙了
签名: 国庆长假还没有缓过来,请让我静一静,产品狗死远点...
引用:JackJiang 发表于 2016-06-30 11:19
下次记得把问题排个版,现在看起来有点乱,但我还是看明白了。

我的建议是这样的:

好的,谢谢你的分享
感谢楼主分享
学习了,不错
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部