Swift - WebSocket 기본 실험

Zion·2022년 7월 11일
0

WebSocket

목록 보기
2/2

앞서 WebSocket에 대해서 설명했습니다.

설명만 가지고는 알 수 없죠! 직접 해봅시다.

v 이 영상을 보고 따라해봤습니다.

https://www.youtube.com/watch?v=VwzXiJgsDrE

WebSocket test site


https://www.piesocket.com/websocket-tester
이 사이트에서 WebSocket 통신을 실험할 수 있습니다.

Code Dive!🏊

Connection Test

private var webSocket: URLSessionWebSocketTask?

^ 실험할 class(저는 ViewController에 했습니다)의 변수로 URLSessionWebSocketTask형 webSocket을 선언합니다.

        let session = URLSession(
            configuration: .default,
            delegate: self,
            delegateQueue: OperationQueue()
        )
        
        guard let url = URL(string: "wss://demo.piesocket.com/v3/channel_1?api_key=VCXCEuvhGcBDP7XhiJJUDvR1e1D3eiVjgZ9VRiaV&notify_self") else { return }
        
        webSocket = session.webSocketTask(with: url)
        webSocket?.resume()

^ URLSession을 선언하고, sessionwebSocketTask에 통신 테스트할 url을 넣어줍니다.

// adopt URLSessionWebSocketDelegate
    func urlSession(
        _ session: URLSession,
        webSocketTask: URLSessionWebSocketTask,
        didOpenWithProtocol protocol: String?
    ) {
        
        print("0 - Did connect to socket")
        ping()
        receive()
        send()
    }

^ URLSessionWebSocketDelegate를 체택한 class에 연결이 됐다는걸 확인하기위해 print문을 넣어줍니다.

실행해보면 잘 연결됐군요.

Ping and Pong

    func ping() {
        
        webSocket?.sendPing(pongReceiveHandler: { error in
            if let error = error {
                print("Ping error: \(error)")
            }
        })
        
    }

ping 을 보냈으니 이제 응답을 받아야겠죠?


    func receive() {
        
        webSocket?.receive(completionHandler: { [weak self] result in
            
            switch result {
            case .success(let message):
                switch message {
                case .data(let data):
                    print("Got data: \(data)")
                case .string(let message):
                    print("Got string: \(message)")
                @unknown default:
                    break
                }
            case .failure(let error):
                print("Receive error: \(error)")
            }
            
            self?.receive()
        })
        
    }

^ 그 다음

    func send() {
        
        DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
            self.send()
            self.webSocket?.send(.string("Send new message: \(Int.random(in: 0...1000))"), completionHandler: { error in
                if let error = error {
                    print("Send error: \(error)")
                }
                
            })
        }
        
    }

^ 이 예시의 경우 1~1000 사이의 랜덤값을 보내고 있습니다.

로그를 해석해봅시다.

"Got string"은 receive에 string case일 경우이죠.
양방향 통신이기 때문에 보낸메세지도 서버에서 반응하기 때문에 로그가 찍히는거 같습니다.

"Hello world!"는 서버에서 계속 보내주고 있습니다.

Cancel

    
    @objc func close() {
        
        webSocket?.cancel(with: .goingAway, reason: "Demo ended".data(using: .utf8))
        
    }
    

^close button을 만들어서 webSocket연결을 취소합니다.

    func urlSession(
        _ session: URLSession,
        webSocketTask: URLSessionWebSocketTask,
        didCloseWith closeCode: URLSessionWebSocketTask.CloseCode,
        reason: Data?
    ) {
        
        print("Did close connection with reason")
        
    }

여기까지 기본 예제 입니다.

profile
어제보다만 나아지는

0개의 댓글