#import "WebSocketManager.h"
#import "SocketRocket/SRWebSocket.h"
NSString *webSocketTestUrl = @"ws://**********:8085/websocket";
NSString *webSocketReleaseUrl = @"ws://**********/websocket";
#define WSHeartTimeOut 120.f
@interface WebSocketManager ()<SRWebSocketDelegate>
//heart
@property (strong, nonatomic) NSTimer *WSHeartTimer;
@property (nonatomic) int webSocketTimeOut;
@end
static WebSocketManager *_instance;
@implementation WebSocketManager{
SRWebSocket *_webSocket;
RMQConnection *connRBMQManager;
RMQQueue *myRMQWmessageQueue;
id<RMQChannel> rmqChannel;
RMQExchange *exChange;
}
+ (WebSocketManager *)Instance{
if (!_instance) {
_instance = [[WebSocketManager alloc]init];
_instance.isConnected = NO;
}
return _instance;
}
//type -2:heart 0:regist 1:正常消息
- (id)eventDataWithString:(int)type regist:(BOOL)isRegist
{
NSError *parseError;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:@{@"msg":@"push_customer", @"type ":@(type), @"customerId":isRegist?@"":@([UserManager sharedInstance].userId), @"content":@"", @"deviceId":@""} options:NSJSONWritingPrettyPrinted error:&parseError];
return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}
- (void)connectWebSocket {
[self onRecevieMessage];
return;
_webSocket.delegate = nil;
[_webSocket close];
_webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:IsTestEnvirenment == 0?webSocketTestUrl:webSocketReleaseUrl]]];
_webSocket.delegate = self;
[_webSocket open];
NSLog(@"open success!-----------------\n");
}
#pragma mark - websocket delegate
- (void)webSocketDidOpen:(SRWebSocket *)webSocket;
{
NSLog(@"Websocket Connected---------------------\n");
//注册
[_webSocket send:[self eventDataWithString:0 regist:YES]];
self.isConnected = YES;
[self wsStartHeartBeat];
}
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
{
NSLog(@":( Websocket Failed With Error %@\n", error);
_webSocket = nil;
self.isConnected = NO;
self.webSocketTimeOut = 120;
}
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;
{
// NSLog(@"Received \"%@\"", message);
if ([message rangeOfString:@"users"].location != NSNotFound && [message rangeOfString:@"customerId"].location == NSNotFound) {
//注册时返回的数据格式不同于以下正常格式 直接忽略 不予处理
return;
}
NSLog(@"Received \"%@\"", message);
if ([message isKindOfClass:[NSString class]]) {
NSError *err = nil;
WSPMessageModel *msgModel = [[WSPMessageModel alloc]initWithString:message error:&err];
if (!err) {
if (msgModel.type == -2 && [msgModel.msg isEqualToString:@"ping"]) {
//心跳 heart
[_webSocket send:[self eventDataWithString:-2 regist:NO]];
NSLog(@"heart -------------------------------------\n\n");
self.webSocketTimeOut = 0;
}else if (dic.type == 1){
[RootRoute pushLocalNotificationWithMessage:msgModel];
if ([self.delegate respondsToSelector:@selector(onRecivedWebSocketMessage:)]) {
[self.delegate onRecivedWebSocketMessage:msgModel];
}
}
}
}
self.isConnected = YES;
}
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
{
NSLog(@"WebSocket closed---------------\n");
_webSocket = nil;
self.isConnected = NO;
self.webSocketTimeOut = 120;
}
- (void)close{
[_webSocket close];
}
#pragma mark - heart beat
- (void)wsStartHeartBeat{
self.webSocketTimeOut = 0;
if (self.WSHeartTimer) {
[self.WSHeartTimer invalidate];
self.WSHeartTimer = nil;
}
[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(wsHeartingBeat) userInfo:nil repeats:NO];
self.WSHeartTimer = [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(wsHeartingBeat) userInfo:nil repeats:YES];
}
- (void)wsHeartingBeat{
self.webSocketTimeOut += 30;
if (self.webSocketTimeOut >= WSHeartTimeOut) {
[self connectWebSocket];//重连
return;
}
}
webSocket简单使用
最新推荐文章于 2022-04-28 14:04:56 发布