SocketServiceHandler.m 5.5 KB

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