IMCAT.DEV
로그인 가입
Dart 고급 네트워크

Dart 소켓 프로그래밍

Dart 소켓 프로그래밍 — 고급

소켓 프로그래밍

1. 도입 (왜 배워야 하는가)

소켓 프로그래밍은 네트워크를 통해 서로 다른 장치 간에 데이터를 주고받는 방법을 제공합니다. 현대의 애플리케이션은 대부분 클라이언트-서버 구조를 채택하고 있으며, 채팅 애플리케이션, 온라인 게임, 실시간 데이터 스트리밍 등에서 필수적으로 사용됩니다. 이 기술을 알지 못하면, 이러한 서비스의 개발이 불가능하거나, 비효율적이거나, 안전하지 않은 방법으로 구현될 수 있습니다.

예를 들어, 실시간 채팅 애플리케이션을 만들 때 소켓 프로그래밍 없이 HTTP 요청만으로 구현하려고 한다면, 매번 서버에 새로운 요청을 보내야 하므로 비효율적이고 느린 응답 속도를 초래하게 됩니다.

2. 핵심 개념 설명

소켓(Socket)

소켓은 네트워크에서 데이터를 송수신하기 위한 엔드포인트입니다. 이를 통해 클라이언트와 서버 간에 통신이 가능합니다.

비유: 소켓은 전화기의 송신기와 수신기와 같아서, 전화기가 두 사람 간의 대화를 가능하게 하듯이, 소켓은 두 컴퓨터 간의 데이터 전송을 가능하게 합니다.

TCP/IP 프로토콜

TCP(Transmission Control Protocol)는 안정적인 데이터 전송을 보장하는 프로토콜입니다. IP(Internet Protocol)는 네트워크에서 데이터를 전송하기 위한 주소 체계입니다.

프로토콜설명
TCP데이터의 순서와 무결성을 보장
UDP빠른 전송을 위한 비연결형 프로토콜

3. 기본 코드 예제

다음은 Dart에서 소켓을 사용해 간단한 서버와 클라이언트를 구현하는 코드입니다.

서버 코드

import 'dart:io';

void main() async {
  var server = await ServerSocket.bind(InternetAddress.loopbackIPv4, 4040);
  print('서버가 실행 중...');

  await for (var socket in server) {
    socket.listen((data) {
      print(String.fromCharCodes(data));
      socket.write('메시지 수신 완료\n');
    });
  }
}

클라이언트 코드

import 'dart:io';

void main() async {
  var socket = await Socket.connect('127.0.0.1', 4040);
  
  socket.write('안녕하세요, 서버!\n');

  socket.listen((data) {
    print(String.fromCharCodes(data));
  });
}

실행 결과

  • 서버: "서버가 실행 중..."
  • 클라이언트: "안녕하세요, 서버!"
  • 서버: "메시지 수신 완료"
  • 동작 설명

    1. 서버는 4040 포트에서 클라이언트의 요청을 기다립니다.
    2. 클라이언트는 서버에 연결하고 메시지를 보냅니다.
    3. 서버는 클라이언트의 메시지를 수신하고 출력한 후, 응답 메시지를 클라이언트에게 보냅니다.
    4. 4. 실전 활용 예제

      예제 1: 채팅 애플리케이션

      쇼핑몰에서 고객과 상담원이 실시간으로 대화할 수 있는 채팅 시스템을 구현할 수 있습니다. 여러 클라이언트가 동시에 서버에 연결되어 메시지를 주고받을 수 있습니다.

      예제 2: 실시간 데이터 스트리밍

      주식 시세나 날씨 데이터를 실시간으로 전송하는 애플리케이션에서 소켓 프로그래밍을 활용하여 서버에서 클라이언트로 데이터를 지속적으로 푸시할 수 있습니다.

      5. 흔한 실수와 주의사항

      실수 1: 포트 충돌

      서버를 실행할 때 이미 사용 중인 포트를 선택하면 오류가 발생합니다.

    5. 잘못된 코드
    6. // 포트 4040이 이미 사용 중일 경우
      var server = await ServerSocket.bind(InternetAddress.loopbackIPv4, 4040);
    7. 올바른 코드
    8. // 다른 포트를 선택
      var server = await ServerSocket.bind(InternetAddress.loopbackIPv4, 5050);

      실수 2: 데이터 수신 처리

      데이터를 수신할 때, listen 메서드를 제대로 설정하지 않으면 데이터를 놓칠 수 있습니다.

    9. 잘못된 코드
    10. socket.listen((data) {
        // 수신 처리 생략
      });
    11. 올바른 코드
    12. socket.listen((data) {
        print(String.fromCharCodes(data)); // 수신 처리
      });

      6. 정리

    13. 소켓 프로그래밍은 클라이언트-서버 간 데이터 송수신을 위한 필수 기술입니다.
    14. TCP는 안정적인 데이터 전송을 보장하며, UDP는 빠른 전송을 위한 프로토콜입니다.
    15. 실전에서는 채팅 애플리케이션, 실시간 데이터 스트리밍 등에 활용됩니다.
    16. 포트 충돌과 데이터 수신 처리를 주의해야 합니다.
    17. 다음에 학습하면 좋은 주제:

    18. WebSocket을 사용한 실시간 통신
    19. RESTful API와 소켓 프로그래밍의 차이점
    20. Dart의 async/await 패턴과 비동기 프로그래밍