1. 소켓 프로그래밍이란 무엇인가
- 소켓의 문자 그대로의 의미
Socket은 원래 콘센트를 뜻하는 영단어입니다. 콘센트는 양쪽 단말 사이 연결을 만들어 주기 때문에 네트워크 프로그래밍에서는 네트워크 통신용 엔드포인트로 의미가 확장되었습니다. - 소켓 프로그래밍 정의
TCP / UDP 네트워크 프로토콜을 사용해 여러 호스트 간 데이터 통신을 구현하는 기법입니다. - 쉽게 이해하기
두 대 이상의 컴퓨터가 서로 데이터를 주고받도록 프로그램을 작성하는 일입니다. 대표적인 예시로 로컬 네트워크 채팅 툴이 있습니다.
비유로 이해하기: 콘센트 = 네트워크 인터페이스, 플러그 = 다른 호스트, 플러그 꽂기 = 네트워크 연결 수립.
개념을 더 잘 익히기 위해 실제 예제를 통해 직접 구현하며 배워보겠습니다.
2. 간단한 채팅 툴 설계 방안
아키텍처 모델: 클라이언트/서버(C/S)
- 서버(Server)
- 로컬 지정 포트에 바인딩하고 네트워크 접속 요청을 계속 수신 대기
- 다른 컴퓨터의 연결 시도를 기다림
- 클라이언트 접속이 감지되면 통신 통로를 생성
- 클라이언트(Client)
서버의 IP 주소와 포트 번호를 기준으로 능동적으로 연결 요청을 보냄 - 통신 목표: 두 컴퓨터가 실시간으로 문자 메시지를 주고받아 인스턴트 채팅을 구현
작동 흐름
- 서버 실행 → 포트 수신 대기 시작
- 클라이언트 실행 → 서버 IP와 포트에 연결 시도
- 연결이 정상적으로 맺히면 양쪽에서 메시지를 주고받음
아래는 가장 간단한 예제 코드입니다
서버
// 1. TcpListener를 생성해 IP와 포트 감시
TcpListener listener = new TcpListener(IPAddress.Any, 8899);
listener.Start();
// 2. 클라이언트 연결 대기
TcpClient client = await listener.AcceptTcpClientAsync();
// 3. 네트워크 스트림을 얻어 메시지 송수신 처리
NetworkStream stream = client.GetStream();
Code language: JavaScript (javascript)
클라이언트
// 서버 IP와 포트에 연결
TcpClient client = new TcpClient();
await client.ConnectAsync("192.168.1.100",8899);
NetworkStream stream = client.GetStream();Code language: JavaScript (javascript)
개요
Next: 서버 측 포트 수신 대기