[Swift] Network 프레임워크

김민석·2024년 8월 16일
0

iOS

목록 보기
7/12

Swift Network 프레임워크?

전송 및 보안 프로토콜을 사용하여 데이터를 보내고 받기 위한 네트워크 연결을 만들기 위해 사용

URLSession사용자 정의 애플리케이션 프로토콜에 대한 TLS, TCP 및 UDP와 같은 프로토콜에 직접 액세스해야 할 때 Network 프레임워크 사용

HTTP 및 URL 기반 리소스를 로드하기 위해 이 프레임워크를 기반으로 사용

이번 포스팅은 해당 Network 프레임워크 공식 문서를 한글화 시켜서
나만의 언어로 재해석해서 적어놓은 기록입니다!




NWListener


들어오는 네트워크 연결을 수신하는데 사용하는 객체

아래와 같이하면 2024포트 번호의 들어오는 수신을 받을 수 있음

init(
    using: NWParameters,
    on: NWEndpoint.Port = .any
) throws

var listerner: NWLinstener? = NWListener(using: NWParameters.tcp, on: 2024)

stateUpdateHandler()


리스너 상태 업데이트를 수신하는 핸들러

@preconcurrency
final var stateUpdateHandler: (@Sendable (_ newState: NWListener.State) -> Void)? { get set }

    listener?.stateUpdateHandler = { state in
        switch state {
        case .ready:
            print("Server is ready.")
        case .failed(let error):
            print("Server failed with error: \(error)")
        default:
            break
        }
    }

State

  • setup: 리스너 초기화 됐지만 시작X
  • waiting(NWError): 리스너는 네트워크 사용 가능해질 때까지 대기
  • ready: 리스너가 실행 중이며 들어오는 연결을 수신할 수 있음
  • failed(NWError): 청취자에게 치명적인 오류 발생
  • cancelled: 청취자가 취소 됨.

newConnectionHanler()


인바운드 연결을 수신하는 핸들러

새로운 연결을 받으면 연결에 업데이트 핸들러를 설정하고 연결을 시작하여 수락함
연결을 거부하려면 연결을 취소

아래 예제는

  1. listener로 네트워크 연결을 수신하고 있는 객체 만들어 둠
  2. newConnectionHandle로 새로운 연결이 옴
  3. 오면 Connection을 출력하기
  4. main queue에서 돌아가야 프로그램 동작
@preconcurrency
final var newConnectionHandler: (@Sendable (_ connection: NWConnection) -> Void)? { get set }

listener?.newConnectionHandler = { newConnection in
     print("[newConnection]", newConnection)
}

listener?.start(queue: .main)

// [newConnection] [C1 127.0.0.1:56428 tcp, local: 127.0.0.1:2024, definite, attribution: developer, server, prohibit joining, path satisfied (Path is satisfied), viable, interface: lo0, scoped]





NWConnection


로컬 엔드 포인트와 원격 엔드 포인트를 연결하여 양방향 데이터 전송을 하는 객체이다.

참고로 엔드 포인트란, 커뮤니케이션의 말단 대상으로 추상화된 객체(서버, 클라이언트 등)를 의미한다.

convenience init(
    host: NWEndpoint.Host,
    port: NWEndpoint.Port,
    using: NWParameters
)

let host = NWEndpoint.Host("127.0.0.1")
let port = NWEndpoint.Port(2024)
var connection: NWConnection? = NWConnection(host: host, port: port, using, NWParameters.tcp)

stateupdateHandler

Listener내부에서 계산 속성으로 정의되어 있다. (final인것을 보아 override안되는 듯)

(_ state: NWConnection.State) -> Void요런 형태의 클로져를 할당해주면 된다.

@Sendable → thread safe한 객체를 의미한는 듯

(https://developer.apple.com/documentation/swift/sendable)

(https://medium.com/@mooyoung2309/swift-sendable이란-d0268cd885de)

@preconcurrency
final var stateUpdateHandler: 
(@Sendable (_ state: NWConnection.State) -> Void)? { get set }

State

현재 연결의 상태를 표시해주는 부분

  • case setup
  • case waiting(NWError)
  • case preparing
  • case ready
  • case failed(NWError)
  • case cancelled
final var state: NWConnection.State { get }

// != 와 ==으로 비교 가능
static func != (lhs: NWConnection.State, rhs: NWConnection.State) -> Bool
static func == (a: NWConnection.State, b: NWConnection.State) -> Bool

Send

연결을 통해 데이터 전송 - 서버에서 받은 데이터 보내줄때 사용할듯

  • content: 전송할 데이터
  • contentContext: 열결에서 전송할 논리적 메시지, 완료가 되어야 다른 메시지 보냄
  • isComplete: 논리적 메시지 전송이 완료되었는지를 나타냄 (finalMessage로 전송완료를 알릴 수 있음)
  • completion: 완료 핸들러를 통해 호출자에게 완료되었을 때를 알릴 수있음
@preconcurrency
final func send(
    content: Data?,
    contentContext: NWConnection.ContentContext = .defaultMessage,
    isComplete: Bool = true,
    completion: NWConnection.SendCompletion
)

SendCompletion

데이터 전송된 처리를 완료한 시점을 나타내는 핸들러

  • contentProcessed: 전송된 데이터가 스택에 의해 처리될 때
  • idempotent: 멱등 데이터(동일한 연산을 여러 번 수행해도 달라지지 않는 데이터)로 표시

receive

연결을 통해 데이터 받기 - 클라이언트에서 보낸 데이터 받을때 사용할듯

  • minimumIncompleteLength: 수신하는 최소 길이
  • maximumLength: 수신하는 최대 길이
  • completion: receive 완료는 receive 호출에 대해 정확히 한번 호출
@preconcurrency
final func receive(
    minimumIncompleteLength: Int,
    maximumLength: Int,
    completion: @escaping @Sendable (_ content: Data?, _ contentContext: NWConnection.ContentContext?, _ isComplete: Bool, _ error: NWError?) -> Void
)





NWEndPoint


네트워크 연결에서 로컬 혹은 원격의 엔드 포인트를 의미한다.

그냥 말그대로 엔드 포인트의 기능을 추상화한 객체라고 보면된다.

NWEndpoint.Host

IP 주소를 설정

case hostPort(
    host: NWEndpoint.Host,
    port: NWEndpoint.Port
)

let host = NWEndpoint.Host(String)

NWEndpoint.Port

포트 번호를 생성하는 것

NWEndpoint.Port(rawValue: portNumber) // 실패가능 생성자

// 위에 것들과 조합하면
let port = NWEndpoint.Port.init(rawValue: 2024)!
let host = NWEndpoint.Host.ipv4(.any)
NWEndpoint.hostPort(host: host, port: port)
// 이렇게 새로운 Endpoint생성 가능





NWParameters


연결에 사용할 프로토콜, 데이터 전송 옵션, 네트워크 경로 제약 조건을 저장하는 객체입니다.

  • tls
  • tcp
  • dtls
  • udp
  • quic
  • quicDatagram
let parameters = NWParameters.tcp
let parameters = NWParameters.udp





참고 자료


https://aviciiiphone.tistory.com/19
공식 문서

profile
개발을 배우는 대학생입니다!

0개의 댓글

관련 채용 정보