SocketServiceHandler.m 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  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. #define MAX_RETRY_CONNECT_COUNT 1
  12. @interface SocketServiceHandler() <SRWebSocketDelegate>
  13. {
  14. SRWebSocket *_socket;
  15. NSMutableArray<NSDictionary *> *_messages;
  16. int _retryCount;
  17. }
  18. @end
  19. @implementation SocketServiceHandler
  20. + (id)sharedManager
  21. {
  22. static SocketServiceHandler *sharedSocketServiceHandler = nil;
  23. static dispatch_once_t onceToken;
  24. dispatch_once(&onceToken, ^{
  25. sharedSocketServiceHandler = [[self alloc] init];
  26. });
  27. return sharedSocketServiceHandler;
  28. }
  29. - (id) init
  30. {
  31. self = [super init];
  32. if (self) {
  33. _isConnected = NO;
  34. //
  35. // _socket = [[SRWebSocket alloc] initWithURL:[NSURL URLWithString:_strSocketURL]];
  36. // _socket.delegate = self;
  37. _messages = [[NSMutableArray alloc] init];
  38. [self socketOpen];
  39. }
  40. return self;
  41. }
  42. - (void) initDelegate:(id<SocketServiceDelegate>) delegate
  43. {
  44. [self setDelegate:delegate];
  45. }
  46. - (SRReadyState) getSocketStatus
  47. {
  48. return _socket.readyState;
  49. }
  50. - (void) socketOpen
  51. {
  52. NSLog(@"socketOpen");
  53. _strSocketURL = [NSString stringWithFormat:@"%@%@", kSocketServer, API_ROOT_PATH];
  54. NSLog(@"socketURL : %@", _strSocketURL);
  55. if( _socket != nil )
  56. [_socket open];
  57. else
  58. {
  59. _socket = [[SRWebSocket alloc] initWithURL:[NSURL URLWithString:_strSocketURL]];
  60. _socket.delegate = self;
  61. [_socket open];
  62. }
  63. }
  64. - (void) open
  65. {
  66. if( !_isConnected )
  67. {
  68. if( _socket.readyState == SR_OPEN )
  69. {
  70. _isConnected = YES;
  71. }
  72. else if ( _socket.readyState == SR_CLOSED || _socket.readyState == SR_CLOSING )
  73. {
  74. [self close];
  75. _socket = nil;
  76. [self socketOpen];
  77. }
  78. }
  79. }
  80. - (void) close
  81. {
  82. if( _isConnected )
  83. {
  84. [_socket close];
  85. _socket = nil;
  86. }
  87. else
  88. {
  89. if (_socket != nil)
  90. {
  91. _socket = nil;
  92. }
  93. }
  94. _isConnected = NO;
  95. }
  96. - (void) sendData:(NSDictionary *)data
  97. {
  98. if(_socket.readyState == SR_OPEN)
  99. {
  100. NSError *error;
  101. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data
  102. options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string
  103. error:&error];
  104. if (!jsonData)
  105. {
  106. NSLog(@"Got an error: %@", error);
  107. }
  108. else
  109. {
  110. NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  111. NSLog(@"Socket Send Data : %@", jsonString);
  112. [_socket send:jsonString];
  113. }
  114. }
  115. else if ( _socket.readyState == SR_CLOSED || _socket.readyState == SR_CLOSING )
  116. {
  117. // TODO : 미전송 메세지 저장하고 있기
  118. [_messages addObject:data];
  119. [self reConnect];
  120. }
  121. else
  122. {
  123. [_messages addObject:data];
  124. }
  125. }
  126. -(void) reConnect
  127. {
  128. if(_retryCount < MAX_RETRY_CONNECT_COUNT)
  129. {
  130. _retryCount++;
  131. [self close];
  132. _socket = nil;
  133. [self socketOpen];
  134. }
  135. else
  136. {
  137. [self close];
  138. }
  139. }
  140. #pragma mark - SRWebSocketDelegate
  141. - (void)webSocketDidOpen:(SRWebSocket *)webSocket
  142. {
  143. NSLog(@"SOCKET didOpen");
  144. _retryCount = 0;
  145. // Open이 되지 않은 상태에서 전송시도한 메세지들을 발송한다.
  146. for (NSDictionary *data in _messages)
  147. {
  148. [self sendData:data];
  149. [_messages removeObject:data];
  150. }
  151. if (self.delegate && [self.delegate respondsToSelector:@selector(socketConnectComplete)]) {
  152. [self.delegate socketConnectComplete];
  153. }
  154. }
  155. - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message
  156. {
  157. NSLog(@"SOCKET didReceiveMessage : %@", message);
  158. NSString *errString = @"";
  159. if( message == nil || [message isEqualToString:@""] )
  160. errString = @"message empty";
  161. else
  162. {
  163. NSError* error = nil;
  164. // NSString *JSONString = [[NSString alloc] initWithData:[message dataUsingEncoding:NSUTF8StringEncoding] encoding:NSUTF8StringEncoding];
  165. NSDictionary *jsonObj = [NSJSONSerialization JSONObjectWithData:[message dataUsingEncoding:NSUTF8StringEncoding]
  166. options:NSJSONReadingAllowFragments
  167. error:&error];
  168. id JSONModel = nil;
  169. // if ([jsonObj isKindOfClass:[NSArray class]])
  170. // {
  171. // NSDictionary *JSONDic = @{@"list": jsonObj};
  172. //
  173. // }
  174. // else
  175. // {
  176. // JSONModel = [[SocketModel alloc] initWithString:JSONString error:&error];
  177. // }
  178. JSONModel = [[SocketModel alloc] initWithDictionary:jsonObj error:&error];
  179. if (self.delegate && [self.delegate respondsToSelector:@selector(socketDidReceiveMessage:)]) {
  180. [self.delegate socketDidReceiveMessage:JSONModel];
  181. }
  182. // if( [message isKindOfClass:[NSString class]] )
  183. // {
  184. // NSError* error = nil;
  185. // NSDictionary *jsonObj = [NSJSONSerialization JSONObjectWithData:[message dataUsingEncoding:NSUTF8StringEncoding]
  186. // options:NSJSONReadingMutableContainers
  187. // error:&error];
  188. //
  189. // if (error != nil) {
  190. // NSLog(@"NSJSONSerialization JSONObject error: %@", [error localizedDescription]);
  191. // return;
  192. // }
  193. //
  194. // NSInteger msgType = [jsonObj[@"type"] integerValue];
  195. //
  196. // if ( msgType == 0 ) {
  197. //
  198. // }
  199. //
  200. // else
  201. // {
  202. // NSLog(@"msgType : %i",(int)msgType);
  203. //
  204. // }
  205. // }
  206. }
  207. }
  208. - (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error
  209. {
  210. NSLog(@"WebSocket error: %@", error);
  211. _isConnected = NO;
  212. [self reConnect];
  213. }
  214. - (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload
  215. {
  216. NSLog(@"WebSocket Receive Pong: %@", pongPayload);
  217. }
  218. - (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean
  219. {
  220. NSLog(@"WebSocket closed with code: %ld reason:%@ wasClean:%d",
  221. (long)code, reason, wasClean);
  222. _isConnected = NO;
  223. [self reConnect];
  224. }
  225. @end