前一段時間公司項目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版本號
}