앞서 WebSocket에 대해서 설명했습니다.
설명만 가지고는 알 수 없죠! 직접 해봅시다.
v 이 영상을 보고 따라해봤습니다.
https://www.youtube.com/watch?v=VwzXiJgsDrE
https://www.piesocket.com/websocket-tester
이 사이트에서 WebSocket 통신을 실험할 수 있습니다.
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¬ify_self") else { return }
webSocket = session.webSocketTask(with: url)
webSocket?.resume()
^ URLSession
을 선언하고, session
의 webSocketTask
에 통신 테스트할 url을 넣어줍니다.
// adopt URLSessionWebSocketDelegate
func urlSession(
_ session: URLSession,
webSocketTask: URLSessionWebSocketTask,
didOpenWithProtocol protocol: String?
) {
print("0 - Did connect to socket")
ping()
receive()
send()
}
^ URLSessionWebSocketDelegate
를 체택한 class에 연결이 됐다는걸 확인하기위해 print문을 넣어줍니다.
실행해보면 잘 연결됐군요.
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!"는 서버에서 계속 보내주고 있습니다.
@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")
}
여기까지 기본 예제 입니다.