SocketServiceHandler.m 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. //
  2. // SocketServiceHandler.m
  3. // OneCable
  4. //
  5. // Created by KaRam Kim on 2017. 2. 17..
  6. // Copyright © 2017년 ntels. All rights reserved.
  7. //
  8. #import "SocketServiceHandler.h"
  9. #import "Definitions.h"
  10. #import "JDJSONModel.h"
  11. #import "JDObject.h"
  12. #define MAX_RETRY_CONNECT_COUNT 1
  13. #define MAX_REQUEST_ID 255
  14. #define NONE_DELEGATE_REQUEST_ID -99
  15. @interface SocketServiceHandler() <SRWebSocketDelegate>
  16. {
  17. SRWebSocket *_socket;
  18. NSMutableArray<SocketRequestModel *> *_messages;
  19. // NSMutableArray *_delegates;
  20. int _retryCount;
  21. BOOL _isShowLoading;
  22. int _loadingRequestId;
  23. }
  24. @property NSMutableDictionary* controllers;
  25. @property NSMutableDictionary* responses;
  26. @property int controllerId;
  27. @end
  28. @implementation SocketServiceHandler
  29. + (id)sharedManager
  30. {
  31. static SocketServiceHandler *sharedSocketServiceHandler = nil;
  32. static dispatch_once_t onceToken;
  33. dispatch_once(&onceToken, ^{
  34. sharedSocketServiceHandler = [[self alloc] init];
  35. });
  36. return sharedSocketServiceHandler;
  37. }
  38. - (id) init
  39. {
  40. self = [super init];
  41. if (self) {
  42. _isConnected = NO;
  43. _messages = [[NSMutableArray alloc] init];
  44. // _delegates = [[NSMutableArray alloc] init];
  45. _controllers = [[NSMutableDictionary alloc] init];
  46. _responses = [[NSMutableDictionary alloc] init];
  47. self.controllerId = 0;
  48. // [self socketOpen];
  49. }
  50. return self;
  51. }
  52. //- (void) initDelegate:(id<SocketServiceDelegate>) delegate
  53. //{
  54. // [self setDelegate:delegate];
  55. //}
  56. - (SRReadyState) getSocketStatus
  57. {
  58. return _socket.readyState;
  59. }
  60. - (void) socketOpen
  61. {
  62. NSLog(@"socketOpen");
  63. _strSocketURL = [NSString stringWithFormat:@"%@%@", kSocketServer, API_ROOT_PATH];
  64. NSLog(@"socketURL : %@", _strSocketURL);
  65. if( _socket != nil )
  66. {
  67. [_socket open];
  68. }
  69. else
  70. {
  71. NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:_strSocketURL]];
  72. if([[JDFacade facade].loginUser authorization]!=nil)
  73. {
  74. [request setValue:[[JDFacade facade].loginUser authorization] forHTTPHeaderField:API_AUTHORIZATION_KEY];
  75. }
  76. NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];
  77. #ifdef DEBUG_MODE
  78. language = @"ko";
  79. #endif
  80. [request setValue:language forHTTPHeaderField:API_LANGUAGE_KEY];
  81. NSLog(@"All Header Info : %@", request.allHTTPHeaderFields);
  82. _socket = [[SRWebSocket alloc] initWithURLRequest:request];
  83. _socket.delegate = self;
  84. [_socket open];
  85. }
  86. }
  87. - (void) open
  88. {
  89. if( !_isConnected )
  90. {
  91. if( _socket.readyState == SR_OPEN )
  92. {
  93. _isConnected = YES;
  94. }
  95. else if ( _socket.readyState == SR_CLOSED || _socket.readyState == SR_CLOSING )
  96. {
  97. [self close];
  98. _socket = nil;
  99. [self socketOpen];
  100. }
  101. }
  102. }
  103. - (void) close
  104. {
  105. if( _isConnected )
  106. {
  107. [_socket close];
  108. _socket = nil;
  109. }
  110. else
  111. {
  112. if (_socket != nil)
  113. {
  114. _socket = nil;
  115. }
  116. }
  117. _isConnected = NO;
  118. }
  119. -(void)sendRequest {
  120. _isShowLoading = YES;
  121. [[JDFacade facade] loadIndicator:YES allowUserInteraction:NO];
  122. }
  123. -(void)fisnishRequest {
  124. _isShowLoading = NO;
  125. [[JDFacade facade] loadIndicator:NO allowUserInteraction:YES];
  126. }
  127. - (void) sendData:(SocketRequestModel *)data
  128. {
  129. if(_socket.readyState == SR_OPEN)
  130. {
  131. NSLog(@"Socket Ready Send Data");
  132. NSLog(@"Send Data : %@", data);
  133. NSLog(@"Send Param : %@", data.getSendMessage);
  134. [_socket send:data.getSendMessage];
  135. }
  136. else if ( _socket.readyState == SR_CLOSED || _socket.readyState == SR_CLOSING )
  137. {
  138. NSLog(@"Socket State is NOT Ready, Retry Process");
  139. [_messages addObject:data];
  140. [self reConnect];
  141. }
  142. else
  143. {
  144. NSLog(@"Socket NOT Ready, Retry Process");
  145. [_messages addObject:data];
  146. if(!_isConnected)
  147. {
  148. [self socketOpen];
  149. }
  150. }
  151. }
  152. - (void) sendDataWihOutDelegate:(SocketRequestModel *)data
  153. {
  154. [self sendDataWithDelegate:data modelClass:nil delegate:nil];
  155. }
  156. - (void) sendDataWithDelegate:(SocketRequestModel *)data delegate:(id)delegate
  157. {
  158. [self sendDataWithDelegate:data modelClass:nil delegate:delegate];
  159. }
  160. - (void) sendDataWithDelegate:(SocketRequestModel *)data modelClass:(Class)modelClass delegate:(id)delegate
  161. {
  162. [self sendDataWithDelegate:data modelClass:modelClass delegate:delegate isShowLoading:NO];
  163. }
  164. - (void) sendDataWithDelegate:(SocketRequestModel *)data modelClass:(Class)modelClass delegate:(id)delegate isShowLoading:(BOOL)isShowLoading
  165. {
  166. short controllerId = NONE_DELEGATE_REQUEST_ID;
  167. if (delegate) {
  168. controllerId = self.controllerId++;
  169. if (self.controllerId >= INT16_MAX) {
  170. self.controllerId = 0;
  171. }
  172. }
  173. NSLog(@"Request Info : %@", data);
  174. data.requestId = [NSString stringWithFormat:@"%d", controllerId];
  175. NSLog(@"Request ID : %@", data.requestId);
  176. if (delegate) {
  177. [_controllers setObject:delegate forKey:[NSNumber numberWithInt:controllerId]];
  178. }
  179. if (modelClass) {
  180. [_responses setObject:modelClass forKey:[NSNumber numberWithInt:controllerId]];
  181. }
  182. if (controllerId!=NONE_DELEGATE_REQUEST_ID && isShowLoading) {
  183. _loadingRequestId = controllerId;
  184. [self sendRequest];
  185. }
  186. [self sendData:data];
  187. }
  188. - (void)removeDelegate:(id)delegate {
  189. // [_delegates removeObject:delegate];
  190. }
  191. -(void) reConnect
  192. {
  193. if(_retryCount < MAX_RETRY_CONNECT_COUNT)
  194. {
  195. _retryCount++;
  196. [self close];
  197. _socket = nil;
  198. [self socketOpen];
  199. }
  200. else
  201. {
  202. [self close];
  203. }
  204. }
  205. #pragma mark - SRWebSocketDelegate
  206. - (void)webSocketDidOpen:(SRWebSocket *)webSocket
  207. {
  208. NSLog(@"SOCKET didOpen");
  209. _retryCount = 0;
  210. // Open이 되지 않은 상태에서 전송시도한 메세지들을 발송한다.
  211. for (SocketRequestModel *data in _messages)
  212. {
  213. [self sendData:data];
  214. [_messages removeObject:data];
  215. }
  216. // for (id controller in _delegates) {
  217. // if (controller && [controller respondsToSelector:@selector(socketConnectComplete)]) {
  218. // [controller socketConnectComplete];
  219. // }
  220. // }
  221. }
  222. - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message
  223. {
  224. NSLog(@"SOCKET didReceiveMessage : %@", message);
  225. NSString *errString = @"";
  226. if( message == nil || [message isEqualToString:@""] )
  227. errString = @"message empty";
  228. else
  229. {
  230. id JSONModel = nil;
  231. NSError *error = nil;
  232. NSString *JSONString = [NSString stringWithUTF8Data:[message dataUsingEncoding:NSUTF8StringEncoding]];
  233. // NSDictionary *jsonObj = [NSJSONSerialization JSONObjectWithData:[message dataUsingEncoding:NSUTF8StringEncoding]
  234. // options:NSJSONReadingAllowFragments
  235. // error:&error];
  236. //
  237. NSLog(@"Json String : %@", JSONString);
  238. if (error != nil) {
  239. NSLog(@"NSJSONSerialization JSONObject error: %@", [error localizedDescription]);
  240. return;
  241. }
  242. SocketModel *response = [[SocketModel alloc] initWithString:JSONString error:&error];
  243. id controller = nil;
  244. Class modelClass = nil;
  245. if (response.requestId != nil && ![response.requestId isEmptyString]) {
  246. NSNumber* controllerId = [NSNumber numberWithInteger:[response.requestId integerValue]];
  247. if ([controllerId integerValue] == _loadingRequestId) {
  248. _loadingRequestId = -999;
  249. [self fisnishRequest];
  250. }
  251. controller = [self.controllers objectForKey:controllerId];
  252. modelClass = [self.responses objectForKey:controllerId];
  253. }
  254. id rawJSON = [NSJSONSerialization JSONObjectWithData:[message dataUsingEncoding:NSUTF8StringEncoding]
  255. options:NSJSONReadingAllowFragments
  256. error:&error];
  257. if (modelClass) {
  258. if ([rawJSON isKindOfClass:[NSArray class]]) {
  259. NSDictionary *JSONDic = @{@"list": rawJSON};
  260. JSONModel = [[modelClass alloc] initWithDictionary:JSONDic error:&error];
  261. }
  262. else {
  263. JSONModel = [[modelClass alloc] initWithString:JSONString error:&error];
  264. }
  265. } else {
  266. JSONModel = rawJSON;
  267. }
  268. if (!controller) {
  269. if (self.controllers.count > 0) {
  270. NSArray* array = self.controllers.allKeys;
  271. for (NSNumber *key in array) {
  272. id controller = [self.controllers objectForKey:key];
  273. if ([controller respondsToSelector:@selector(socketDidReceiveMessage:result:)]) {
  274. [controller socketDidReceiveMessage:JSONModel result:response];
  275. }
  276. }
  277. }
  278. [[NSNotificationCenter defaultCenter] postNotificationName:kSocketBoradCast object:JSONModel];
  279. }
  280. else {
  281. if ([controller respondsToSelector:@selector(socketDidReceiveMessage:result:)]) {
  282. [controller socketDidReceiveMessage:JSONModel result:response];
  283. }
  284. [self.controllers removeObjectForKey:[NSNumber numberWithInteger:[response.requestId integerValue]]];
  285. // if (self.controllers.count > 1) {
  286. // NSArray* array = self.controllers.allKeys;
  287. // NSArray* sortedArray = [array sortedArrayUsingSelector:@selector(compare:)];
  288. //
  289. // [self.controllers removeObjectForKey:[sortedArray objectAtIndex:0]];
  290. // }
  291. }
  292. // TODO : 전달받은 데이터로 자동으로 처리할 내용이 있으면 이곳에서 처리할것
  293. }
  294. }
  295. - (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error
  296. {
  297. NSLog(@"WebSocket error: %@", error);
  298. _isConnected = NO;
  299. [self reConnect];
  300. }
  301. - (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload
  302. {
  303. NSLog(@"WebSocket Receive Pong: %@", pongPayload);
  304. }
  305. - (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean
  306. {
  307. NSLog(@"WebSocket closed with code: %ld reason:%@ wasClean:%d",
  308. (long)code, reason, wasClean);
  309. _isConnected = NO;
  310. [self reConnect];
  311. }
  312. @end