前一段时间公司项目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版本号
}