ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 소켓통신
    Swift 2021. 4. 19. 16:21

    안녕하세요. 그린입니다🟢

    이번 포스팅에서는 소켓통신에 대해 알아보고 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://nsios.tistory.com/28

    https://en.wikipedia.org/wiki/Socket.IO

    https://babbab2.tistory.com/9

    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
Designed by Tistory.