iOS 실시간 통신 응용 개발 기술 요점

간단한 IM 통신 프로세스


클라이언트가 socket (...) 를 호출하여 socket 만들기;클라이언트가connect(...)를 호출하여 서버에 연결 요청을 합니다.클라이언트와 서버가 연결되면send(...)/receive(...)를 통해 클라이언트에게 데이터를 보내거나 클라이언트로부터 수신할 수 있습니다.클라이언트가close를 호출하여 socket을 닫기;

통신 프로토콜의 선택


TCP와 UDP의 차이점


TCP-Transmission Control Protocol
연결을 위해 신뢰할 수 있는 연결을 구축하고 연결 과정에서 세 번의 악수, 연결 끊기 네 번의 악수, 안전한 연결
UDP-User Data Protocol
비연결 프로토콜, 시스템 자원에 대한 사용이 적고 프로그램 구조가 간단하며 안전하지 않습니다. 패키지 TCP는 실시간 통신을 실현하는 프로토콜이 비교적 간단합니다. UDP는 패키지 문제를 해결해야 합니다.

채팅 프로토콜 선택


Socket 채팅 프로토콜


Scoket 원본 Socket이 TCP/IP 또는 UDP/IP에 적용되는 프로그래밍 인터페이스를 바탕으로 네트워크를 뛰어넘는 프로세스 간 통신 클라이언트가 socket(...)을 호출하여 socket을 생성합니다.클라이언트가connect(...)를 호출하여 서버에 연결 요청을 합니다.클라이언트와 서버가 연결되면send(...)/receive(...)를 통해 클라이언트에게 데이터를 보내거나 클라이언트로부터 수신할 수 있습니다.클라이언트가close를 호출하여 socket을 닫기;Socket: ClinetSocket = socket(AF_INET, SOCK_STREAM, 0) 만들기;

프레임 기반 CocoaAsyncSocket


각각 TCP와 UDP 두 가지 전송 프로토콜에서의 통신을 실현했고 GCDAsyncSocket과 GCDAsyncUdpSocket에 대응했다.연결 설정: [gcdSocket connectToHost: Khost onPort: Kport error:nil];연결 성공 호출: - (void) socket: (GCDASyncSocket) sock didConnectToHost: (NSString) host port: (uint16_t) port 발송 메시지: NSData *data = [msg dataUsingEncoding: NSUTF8StringEncoding];//두 번째 파라미터, 시간 초과 요청 [gcdSocket writeData:data with Timeout:-1 tag:110];연결 해제: [gcdSocket disconnect];연결을 끊을 때 호출: - (void) socketDisconnect: (GCDASyncSocket) sock withError: (nullable NSError)err;

WebSocket 채팅 프로토콜


WebScoket 기반: 대표 프레임워크 SocketRocket 초기화 연결: webSocket = [[[SRWebSocket alloc] initWithURL: [NSURL URL WithString: [NSString With Format: @'ws://%@','Khost, Kport]]];webSocket.delegate = self; //프록시 루틴queue NSOperationQueue *queue = [[NSOperationQueue alloc]init] 설정;queue.maxConcurrentOperationCount = 1; [webSocket setDelegateOperationQueue:queue]; //[webSocket open] 연결;심장 박동 초기화:dispatch_main_async_safe(^{[self destory HeartBeat];_weak typeof(self)weakSelf=self;//심장박동은 3분으로 설정하고, NAT 시간 초과는 보통 5분 heartBeat=[NSTimer scheduledTimer WithTimeInterval:3*60 repeats:YES block:^(NSTimer*_Nonnull timer){NSLog(@'heart');//서버와 심장박동 표시로 무엇을 보내기로 약속하고 심장박동 패키지 크기를 최대한 줄이기[weakSelf sendMs] g:@ "heart";}];[[NSRunLoop currentRunLoop]addTimer:heartBeat forMode:NSRunLoopCommonModes]; }) 심장 박동 해제:dispatch_main_async_safe(^{ if (heartBeat) { [heartBeat invalidate]; heartBeat = nil; } }) 재연결 메커니즘: [self disConnect];//1분이 지나면 다시 연결하지 않기 때문에 2^5 = 64if(reConnectTime > 64) {return;}
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(reConnectTime * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            webSocket = nil;
        [self initSocket];
    });
        // 2 
        if (reConnectTime == 0) {
                reConnectTime = 2;
        }else{
                reConnectTime *= 2;
        }

XMPP 채팅 프로토콜


XMPP 기반: 프레임워크 XMPPFramework를 나타냅니다.확장성이 강하고 프로토콜 소스에서 얻은 통신 데이터는 XML 형식이기 때문에 XML로 XMPP를 해석하는 것은 IM에 있어서 정말 중용할 수 없다.단지 장난감 데모로서 모두에게 손을 익힐 수 있을 뿐이다.인터넷에 XMPP 내용이 너무 많아요. 상당 부분은 오픈파이어로 서비스를 하는데 이 물건은 정말 너무 낡았어요.몇 년 전, 건물주가 IM을 처음 알게 된 것이 바로 이 물건이라는 것을 기억하고 있다.

MQTT 채팅 프로토콜


MQTT 기반: 대표 프레임워크인 MQTTKit는 IM을 위한 프로토콜이 아니다. 푸시를 많이 사용하고 푸시+구독 모드에 적용된다. 응용층 프로토콜의 주요 클래스인 MQTTClient: 이 클래스는 모두 4개 부분으로 나뉜다. 초기화, 연결, 발표, 구독은 우리가 연결에 성공하면 우리는clientID 메시지를 구독해야 자신에게 보내는 메시지를 받을 수 있다.그 다음은 이 프레임워크가 우리를 위해 QOS 메커니즘을 실현시켰다

데이터 전송 형식 선택


JSON 또는 XML, or Google의 ProtocolBuffer ProtocolBuffer: ProtocolBuffer를 사용하여 Payload(부하)를 줄이고 택시를 40% 적신다.휴대하기 전에 공유한 바와 같이 새로운 Protocol Buffer 데이터 형식 + Gzip을 사용하여 압축한 Payload 크기가 15%-45% 감소했다고 합니다.데이터 정렬화 소모 시간이 80%-90% 감소했다.효율적이고 안전한 개인 프로토콜을 채택하여 긴 연결의 복용을 지원하고 전기를 절약하고 유량을 절약하는 것을 안정시킨다.[효율] 네트워크 요청 성공률을 높이고 메시지체가 클수록 실패 확률이 증가한다.[유량 절약] 유량 소모가 극히 적고 유량을 절약하다.하나의 메시지 데이터가 Protobuf로 서열화된 후의 크기는 JSON의 1/10, XML 형식의 1/20, 이진 서열화의 1/10이다.Protobuf는 XML에 비해 성능이 뛰어납니다.XML보다 3 ~ 10배 작고 20 ~ 100배 빠른 효율적인 바이너리 방식으로 저장됩니다.[절전] 절전[고효율 심장 박동 패키지] 동시에 심장 박동 패키지 프로토콜은 IM의 전량과 유량에 큰 영향을 미치기 때문에 심장 박동 패키지 프로토콜에 대해 간단한 설계를 실시했다. 1Byte만.[사용하기 쉽게] 개발자는 일정한 문법에 따라 구조화된 메시지 형식을 정의한 다음에 명령행 도구를 보내면 도구는 관련 클래스를 자동으로 생성하고java, c++,python,Objective-C 등 언어 환경을 지원할 수 있다.단점: APP의 가방 부피가 커질 수 있습니다. Google에서 제공하는 스크립트를 통해 생성된 모델은 매우'방대하다'. 모델이 많으면 가방 부피도 커집니다.

세부적인 문제의 고려


심장 박동 메커니즘: TCP 연결의 쌍방이 사용할 수 있는지 검사합니다.클라이언트가 심장박동Ping(일반적으로 클라이언트)을 시작합니다. 만약에 설정한 지 10초 후에 리셋을 받지 못하면 서버나 클라이언트 어느 한 측에 문제가 생겼습니다. 이때 우리는 주동적으로 연결을 끊어야 합니다.서비스 측도 마찬가지로 socket의 심장 박동 간격을 유지한다. 약속 시간 내에 클라이언트가 보낸 심장 박동을 받지 못하면 우리는 이 연결이 이미 효력을 잃었다는 것을 알고 자발적으로 연결을 끊는다.이동단 IM은 심장 박동이 필요합니다. 국내 통신사 NAT가 시간을 초과합니다.PingPong 메커니즘: 서비스 측에서 Ping을 보내면 클라이언트가 약속한 시간 내에 응답한ack을 되돌려 주지 않으면 클라이언트가 이미 온라인이 아니라고 생각합니다. 이때 우리 서버 측은 자발적으로 Scoket 연결을 끊고 APNS가 푸시하는 방식으로 메시지를 보냅니다.마찬가지로 클라이언트가 메시지를 보낼 때 서비스 측의 응답 패키지를 늦게 받을 수 없기 때문에 클라이언트나 서비스 측이 오프라인 상태임을 나타낸다. 또한 메시지 발송 실패를 표시하고 Scoket 연결을 끊을 수 있다.Qos 메커니즘: QoS(Quality of Service, 서비스 품질)는 하나의 네트워크가 각종 기초 기술을 이용하여 지정된 네트워크 통신에 더욱 좋은 서비스 능력을 제공할 수 있는 것을 가리키며 네트워크의 안전 메커니즘으로 네트워크의 지연과 막힘 등 문제를 해결하는 기술이다.QOS(0), 최대 한 번 발송: 메시지가 전송되지 않으면 바로 분실됩니다.QOS(1), 한 번 이상 보내기: 메시지를 반드시 보내야 하지만 몇 번 보내야 할지 확실하지 않습니다.QOS(2), 정확하게 한 번만 발송: 메시지 전송을 확보하고 한 번만 발송하는 복잡한 발송 메커니즘이 내부에 있습니다.재연결 메커니즘: 일반적인 해결 방안은 재연결을 몇 번 시도하는 것이다. 만약 여전히 재연결이 성공하지 못한다면 더 이상 재연결을 하지 않는다.알리페이의 결제 성공 후의 리셋 메커니즘과 같은 리셋 시간 지수급 증가의 리셋 방식을 봉인한다.보안 메커니즘: DNS 오염 방지, 계정 보안, 제3자 서버 모니터링, 단일 로그인 등

좋은 웹페이지 즐겨찾기