前一段时间公司项目IM底层改成用Mars来开发,Mars客户端是基于C++来开发的,在刚开始使用的过程中也遇到了一些问题,现在总结如下:
- 对于客户端发起的心跳,服务器必须要有响应回包,否则长连接很快就会断掉.
- 对于客户端通过
Mars发出去的请求,如果服务器端响应回包时必须要有seq(也可以叫其它名字),并且该字段的值要与客户端发过去的值相同. - 客户端发出去的包不一定需要服务器端的回应,可能通过
Task的send_only属性进行设置,eg:
Task ctask;
ctask.cmdid = task.cmdid;
ctask.channel_select = task.channel_select;
ctask.cgi = std::string(task.cgi.UTF8String);
ctask.shortlink_host_list.push_back(std::string(task.host.UTF8String));
ctask.user_context = (__bridge void*)task;
ctask.send_only = task.sendOnly;
- 当请求服务器长时间不回的话,
Mars会认为这个连接有问题,会断开重连,并走它的自动重连逻辑. - 可以在stn_callback.mm类中监听
Mars连接状态的变化:
void StnCallBack::ReportConnectStatus(int _status, int longlink_status) {
[[LCNetworkService sharedInstance] OnConnectionStatusChange:_status longConnStatus:longlink_status];
switch (longlink_status) {
case mars::stn::kServerFailed:
case mars::stn::kServerDown:
case mars::stn::kGateWayFailed:
break;
case mars::stn::kConnecting:
break;
case mars::stn::kConnected:
break;
case mars::stn::kNetworkUnkown:
return;
default:
return;
}
}
- 对于一些帐号和设备信息最好也设置一些,如果不设置的话,Mars重连时间间隔会变大:
std::string AppCallBack::GetAppFilePath(){
NSString *appPath = @"your app file path";
return std::string([appPath UTF8String]);
}
AccountInfo AppCallBack::GetAccountInfo() {
AccountInfo info;
info.username = "user name";
info.uin = 1233333;//设置一个用户ID即可
return info;
}
DeviceInfo AppCallBack::GetDeviceInfo() {
DeviceInfo info;
info.devicename = "your device name";
info.devicetype = 1;
return info;
}
unsigned int AppCallBack::GetClientVersion() {
return 1;//返回你的app版本号
}

本文分享了使用 Mars 开发即时通讯客户端的经验,包括客户端与服务器交互的注意事项,如心跳机制、seq 字段匹配及连接状态监听等,并介绍了如何设置帐号和设备信息以优化重连策略。

4

被折叠的 条评论
为什么被折叠?



