| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- //
- // SocketServiceHandler.m
- // OneCable
- //
- // Created by KaRam Kim on 2017. 2. 17..
- // Copyright © 2017년 ntels. All rights reserved.
- //
- #import "SocketServiceHandler.h"
- #import "Definitions.h"
- #import "JDJSONModel.h"
- #define MAX_RETRY_CONNECT_COUNT 1
- @interface SocketServiceHandler() <SRWebSocketDelegate>
- {
- SRWebSocket *_socket;
- NSMutableArray<NSDictionary *> *_messages;
-
- int _retryCount;
- }
- @end
- @implementation SocketServiceHandler
- + (id)sharedManager
- {
- static SocketServiceHandler *sharedSocketServiceHandler = nil;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- sharedSocketServiceHandler = [[self alloc] init];
- });
- return sharedSocketServiceHandler;
- }
- - (id) init
- {
- self = [super init];
-
- if (self) {
-
- _isConnected = NO;
- //
- // _socket = [[SRWebSocket alloc] initWithURL:[NSURL URLWithString:_strSocketURL]];
- // _socket.delegate = self;
-
- _messages = [[NSMutableArray alloc] init];
-
- [self socketOpen];
- }
-
- return self;
- }
- - (void) initDelegate:(id<SocketServiceDelegate>) delegate
- {
- [self setDelegate:delegate];
- }
- - (SRReadyState) getSocketStatus
- {
- return _socket.readyState;
- }
- - (void) socketOpen
- {
- NSLog(@"socketOpen");
- _strSocketURL = [NSString stringWithFormat:@"%@%@", kSocketServer, API_ROOT_PATH];
- NSLog(@"socketURL : %@", _strSocketURL);
-
- if( _socket != nil )
- [_socket open];
- else
- {
- _socket = [[SRWebSocket alloc] initWithURL:[NSURL URLWithString:_strSocketURL]];
- _socket.delegate = self;
-
- [_socket open];
- }
- }
- - (void) open
- {
- if( !_isConnected )
- {
- if( _socket.readyState == SR_OPEN )
- {
- _isConnected = YES;
- }
- else if ( _socket.readyState == SR_CLOSED || _socket.readyState == SR_CLOSING )
- {
- [self close];
- _socket = nil;
- [self socketOpen];
- }
- }
- }
- - (void) close
- {
- if( _isConnected )
- {
- [_socket close];
- _socket = nil;
- }
- else
- {
- if (_socket != nil)
- {
- _socket = nil;
- }
- }
- _isConnected = NO;
- }
- - (void) sendData:(NSDictionary *)data
- {
- if(_socket.readyState == SR_OPEN)
- {
- NSError *error;
- NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data
- options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string
- error:&error];
-
- if (!jsonData)
- {
- NSLog(@"Got an error: %@", error);
- }
- else
- {
- NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
- NSLog(@"Socket Send Data : %@", jsonString);
- [_socket send:jsonString];
- }
- }
- else if ( _socket.readyState == SR_CLOSED || _socket.readyState == SR_CLOSING )
- {
- // TODO : 미전송 메세지 저장하고 있기
- [_messages addObject:data];
- [self reConnect];
- }
- else
- {
- [_messages addObject:data];
- }
- }
- -(void) reConnect
- {
- if(_retryCount < MAX_RETRY_CONNECT_COUNT)
- {
- _retryCount++;
- [self close];
- _socket = nil;
- [self socketOpen];
- }
- else
- {
- [self close];
- }
- }
- #pragma mark - SRWebSocketDelegate
- - (void)webSocketDidOpen:(SRWebSocket *)webSocket
- {
- NSLog(@"SOCKET didOpen");
- _retryCount = 0;
- // Open이 되지 않은 상태에서 전송시도한 메세지들을 발송한다.
- for (NSDictionary *data in _messages)
- {
- [self sendData:data];
- [_messages removeObject:data];
- }
-
- if (self.delegate && [self.delegate respondsToSelector:@selector(socketConnectComplete)]) {
- [self.delegate socketConnectComplete];
- }
- }
- - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message
- {
- NSLog(@"SOCKET didReceiveMessage : %@", message);
-
-
-
- NSString *errString = @"";
-
- if( message == nil || [message isEqualToString:@""] )
- errString = @"message empty";
- else
- {
- NSError* error = nil;
- // NSString *JSONString = [[NSString alloc] initWithData:[message dataUsingEncoding:NSUTF8StringEncoding] encoding:NSUTF8StringEncoding];
- NSDictionary *jsonObj = [NSJSONSerialization JSONObjectWithData:[message dataUsingEncoding:NSUTF8StringEncoding]
- options:NSJSONReadingAllowFragments
- error:&error];
-
- id JSONModel = nil;
- // if ([jsonObj isKindOfClass:[NSArray class]])
- // {
- // NSDictionary *JSONDic = @{@"list": jsonObj};
- //
- // }
- // else
- // {
- // JSONModel = [[SocketModel alloc] initWithString:JSONString error:&error];
- // }
- JSONModel = [[SocketModel alloc] initWithDictionary:jsonObj error:&error];
-
- if (self.delegate && [self.delegate respondsToSelector:@selector(socketDidReceiveMessage:)]) {
-
- [self.delegate socketDidReceiveMessage:JSONModel];
- }
-
- // if( [message isKindOfClass:[NSString class]] )
- // {
- // NSError* error = nil;
- // NSDictionary *jsonObj = [NSJSONSerialization JSONObjectWithData:[message dataUsingEncoding:NSUTF8StringEncoding]
- // options:NSJSONReadingMutableContainers
- // error:&error];
- //
- // if (error != nil) {
- // NSLog(@"NSJSONSerialization JSONObject error: %@", [error localizedDescription]);
- // return;
- // }
- //
- // NSInteger msgType = [jsonObj[@"type"] integerValue];
- //
- // if ( msgType == 0 ) {
- //
- // }
- //
- // else
- // {
- // NSLog(@"msgType : %i",(int)msgType);
- //
- // }
- // }
- }
- }
- - (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error
- {
- NSLog(@"WebSocket error: %@", error);
-
- _isConnected = NO;
- [self reConnect];
- }
- - (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload
- {
- NSLog(@"WebSocket Receive Pong: %@", pongPayload);
- }
- - (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean
- {
- NSLog(@"WebSocket closed with code: %ld reason:%@ wasClean:%d",
- (long)code, reason, wasClean);
-
- _isConnected = NO;
- [self reConnect];
- }
- @end
|