-
안녕하세요. 그린입니다🟢
이번 포스팅에서는 소켓통신에 대해 알아보고 swift에서는 어떻게 사용되는지 간단히 알아보겠습니다📝
소켓통신?
- 네트워크를 통해 서버 클라이언트 두 부분에 링크 생성 후 해당 링크를 통해 데이터를 주고 받는 기술
- HTTP 통신인 Request / Response의 단점을 해결해줌 (데이터 요청을 계속 해야하는 단점..!)
- 서버에서 포트번호 설정하면 클라이언트에서 해당 포트로 접속 시 연결됨 (연결되어 있어서 데이터가 들어오면 바로바로 처리 가능)
- 스위프트에서는 socket.IO를 사용해 구현
- 연결지향적 통신 / 실시간 통신 (채팅 및 스트리밍 등)
HTTP 통신과의 차이?
- HTTP 통신은 클라이언트가 요청을 보낼때만 서버가 응답하고 그 과정이 끝나면 연결 종료되는 단방향
- 소켓 통신은 클라이언트가 요청을 보내서 서버와의 포트를 열어 연결을 유지해 통신하는 방식으로 양방향 통신으로 HTTP 통신인 데이터 요청을 계속 해야하는 단점을 해결해줌
소켓통신의 2가지 방법
- TCP (스트림 소켓) / UDP (데이터그램 소켓)
TCP (스트림 소켓)
- 연결형 프로토콜로 연결 성공한 후 통신이 가능
- 데이터를 메시지 형태로 보내기 위한 IP와 함께쓰는 프로토콜
- 나눠진 데이터의 손실여부를 판단하고 재조립하는 과정을 추적 (빠진 패킷이 없는지 체크) // 패킷 추적 관리
- 패킷을 수신할때마다 ACK(acknowledge)라는 별도 패킷을 재전송해주고 만약 재전송을 받지 못하면 일정 시간 후 다시 해당 패킷을 재전송하여 안정성을 높임
- UDP에 비해 전송 속도가 느림
** ACK -> "잘받음" 이라는 의미의 acknowledge의 약자 송신측에서 패킷을 송신하면 수신측에서 ack를 보내 정상적으로 데이터를 수신했다는걸 알려주기 위한 별도의 패킷
UDP (데이터그램 소켓)
- 비연결형 프로토콜로 연결없이 통신이 가능
- 데이터를 데이터그램 단위로 처리 (독립적 단계를 지닌 패킷)
- TCP는 일대일교환이면 UDP는 일대일/일대다/다대다 통신 교환 방식
- TCP에 비해 신뢰 및 안정성이 낮음
- 데이터 순서 변경이나 유실될 가능성도 많지만 장점으로는 속도가 빠름
socket.IO
- 스위프트에서 소켓통신을 할 수 있게해주는 프레임워크 (쉽게 소켓을 구현)
- https://github.com/socketio/socket.io-client-swift
- 소켓을 룸(namesake) 단위로 나누는 기능을 포함하고 있음 (/room1, /room2 등..)
- Node.js 서버 구현체 오직 (자바스크립트로 이뤄진 라이브러리)
- 실시간 웹 애플리케이션을 위한 양방향 통신이 가능
socket.IO 메서드
- socket.connect(): 설정 주소/포트로 소켓 연결
- socket.disconnect(): 소켓 연결 해제
- socket.emit(“event”, [“data”]): 이벤트명으로 데이터 송신
- socket.on(“event”): 이벤트명으로 송신된 이벤트 수신
socket?.emit("event", "data") socket?.on("event") { (data, ack) in if let message = data.first as? String { print(message) } }
[느낀점]
HTTP 통신만 생각하고 있었는데 소켓 통신을 접하고 나니 어떤 차이가 있는지 어느 상황에서 어떤 통신 방식이 더 괜찮은지 생각을 해보게 되었다. 소켓 통신은 매번 HTTP 통신처럼 서버에 요청을 할 수 없으니 연결을 시켜놓고 이벤트가 발생되면 바로바로 데이터 등 해당되는것을 처리할 수 있는 좋은 통신 방식인것 같다. 소켓 통신에도 TCP / UDP로 나눌 수 있는데 아직 어느 상황에서 확실히 어떤걸 써야하는지 감은 오지 않았다. 조금 느리더라도 데이터 손실의 위험성이 적고 신뢰 할 수 있는 TCP 스트림 소켓 방식이 더 적합할 것 같은데 UDP로 어느 상황에서 속도의 중요성으로 그렇게 사용되는지는 좀 더 학습해봐야겠다.
[참고자료]
야곰 iOS 커리어 캠프
https://en.wikipedia.org/wiki/Socket.IO
https://ichi.pro/ko/socket-iowaui-silsigan-keullaieonteu-seobeo-tongsin-73743105459539
'Swift' 카테고리의 다른 글
Result (0) 2021.04.28 Closure 심화 (0) 2021.04.27 Early Exit (0) 2021.04.13 Optional Chaining (0) 2021.04.12 GCD & Operation (0) 2021.04.09