투케이2K

125. (TWOK/LOGIC) [Ios] NWConnection 사용해 TCP IP 소켓 연결 및 receive 실시간 메시지 수신 상태 확인 , 재귀 호출 로직 본문

투케이2K 로직정리

125. (TWOK/LOGIC) [Ios] NWConnection 사용해 TCP IP 소켓 연결 및 receive 실시간 메시지 수신 상태 확인 , 재귀 호출 로직

투케이2K 2024. 11. 27. 19:19

[로직 정리]

정리 로직 : Ios / 아이폰

상태 : [Ios] NWConnection 사용해 TCP IP 소켓 연결 및 receive 실시간 메시지 수신 상태 확인 , 재귀 호출 로직

 

[설 명]

 

// --------------------------------------------------------------------------------------
[사전) 설정 및 정보 확인 사항]
// --------------------------------------------------------------------------------------

- TCP IP 소켓 통신을 수행하기 위한 IP , PORT 정보 확인 필요


- 사전) 위치 권한 설정 필요


- NWConnection 설명 :

  >> NWConnection 는 로컬 엔드포인트와 원격 엔드포인트 간의 양방향 데이터 연결 (TCP , UDP) 을 수행할 수 있습니다

  >> NWConnection 를 사용하기 위해서는 import Network 패키지 호출 정의가 필요합니다

  >> NWParameters 설정 가능 옵션 : 

   - tls
   - tcp
   - dtls
   - udp
   - quic
   - quicDatagram

  >> 참고 사이트 : https://developer.apple.com/documentation/network/nwconnection

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[로직 설명]
// --------------------------------------------------------------------------------------

1. 애플리케이션 실행 및 TCP IP 소켓 통신을 수행할 수 있는 화면 진입


2. 소켓 통신 화면에서 특정 IP , PORT 정보를 사용해 NWConnection TCP IP 소켓 통신 연결 수행 및 연결 상태 모니터링 실시


3. 정상적으로 소켓 연결이 완료 되어 stateUpdateHandler 핸들러 ready 상태가 되면 실시간 메시지 수신 함수 등록 수행

    >> [실시간 소켓 연결 상태 감지 핸들러]
    C_TcpIp_Client_Socket_Module.connection?.stateUpdateHandler = { state in
        switch state {
        case .ready:
            S_Log._D_(description: "소켓 생성 및 연결 성공", data: [
                "M_LOG :: [Success] : Connection Ready State",
                "IP :: \(ip)",
                "PORT :: \(port)"
            ])
            
            // ---------------------------------------------
            // MARK: [실시간 소켓 메시지 수신 상태 확인]
            // ---------------------------------------------
            self.receiveData()

            
        case .failed(let error):
            S_Log._D_(description: "소켓 생성 및 연결 실패", data: [
                "M_LOG :: [Fail] : Connection Fail State",
                "Description :: \(error)"
            ])
            
            
        case .cancelled:
            S_Log._D_(description: "소켓 생성 및 연결 실패", data: [ "M_LOG :: [Cancel] : Connection Cancel State" ])
            
            
        default:
            break
        }
    }


4. NWConnection receive 함수에서 실시간 응답 메시지가 수신 된 경우 데이터 파싱 및 로직 처리 후 다시 메시지를 감지하기 위해 재귀 호출 수행 및 응답 대기

    >> [함수 소스 코드 첨부]
    private func receiveData() {
        
        if C_TcpIp_Client_Socket_Module.connection != nil {
            
            C_TcpIp_Client_Socket_Module.connection?.receive(minimumIncompleteLength: 1, maximumLength: 1024, completion: { data, _, isComplete, error in
                
                // ---------------------------------------------
                // MARK: [실시간 메시지 수신 확인]
                // ---------------------------------------------
                if let data = data, !data.isEmpty {
                    let message = String(data: data, encoding: .utf8) ?? ""
                    
                    S_Log._D_(description: "[Ing] ---- [소켓 실시간 메시지 수신 감지] ---- [Ing]", data: [
                        "message :: \(message)"
                    ])
                    
                    
                    // ---------------------------------------------
                    // MARK: [로직 분기 처리]
                    // ---------------------------------------------
                    
                }

                
                // ---------------------------------------------
                // MARK: [계속해서 실시간 메시지 수신 처리]
                // ---------------------------------------------
                if isComplete {
                    S_Log._D_(description: "소켓 실시간 메시지 수신 감지 에러", data: [ "M_LOG :: [Error] : Connection closed by server" ])
                    
                    // ---------------------------------------------
                    // MARK: [소켓 연결 종료 및 객체 초기화]
                    // ---------------------------------------------
                    C_TcpIp_Client_Socket_Module.connection?.cancel()
                    
                } else if let error = error {
                    S_Log._D_(description: "소켓 실시간 메시지 수신 감지 에러", data: [
                        "M_LOG :: [Error] : let error catch",
                        "Description :: \(error)"
                    ])
                    
                    // ---------------------------------------------
                    // MARK: [소켓 연결 종료 및 객체 초기화]
                    // ---------------------------------------------
                    C_TcpIp_Client_Socket_Module.connection?.cancel()
                    
                } else {
                    
                    // ---------------------------------------------
                    // [계속해서 데이터 수신]
                    // ---------------------------------------------
                    self.receiveData()
                    
                }
            })
            
        }
        else {
            S_Log._D_(description: "소켓 실시간 메시지 수신 감지 에러 :: connection is null", data: nil)
        }
        
    }
// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[참고 사이트]
// --------------------------------------------------------------------------------------

[Ios - NWConnection 설명 및 TCP IP 소켓 통신 연결 및 데이터 전송 방법]

https://blog.naver.com/kkh0977/223670153413


[Ios - NWConnection 사용해 TCP IP 소켓 통신 NWProtocolTCP.Options 옵션 설정 방법]

https://blog.naver.com/kkh0977/223672535940


[Ios - NWConnection 사용해 TCP IP 소켓 통신 연결 후 stateUpdateHandler 연결 상태 확인 방법]

https://blog.naver.com/kkh0977/223672601987

// --------------------------------------------------------------------------------------

 

반응형
Comments