[WPF] TCP Server, Client 만들기

[WPF] TCP Server, Client 만들기

이번 글에서는 TCP 통신으로 Server와 Client를 만들어 보겠습니다. 전체적인 코드는 github을 참고해주시기 바랍니다.

주요 클래스, 함수

우선 서버 쪽 필수 클래스는 TcpListener입니다. TcpListener의 핵심 코드들은 아래와 같습니다.

  • Start: 서버를 구동합니다.
  • AcceptTcpClient, AcceptTcpClientAsync: 클라이언트가 연결을 요청하면 이를 수락하고, 해당 클라이언트 객체(TcpClient)를 반환합니다.
  • Stop: 서버의 동작을 중지하고 수신 대기를 종료합니다.

클라이언트 쪽 클래스는 TcpClient입니다. 대표적인 함수는 아래와 같습니다.

  • Connect, ConnectAsync: 서버의 IP와 Port를 입력하여 서버에 연결을 시도합니다.
  • Close: 통신이 끝나고 TCP 연결을 안전하게 종료하고 네트워크 리소스를 해제합니다.

통신 객체

통신을 할 때 사용되는 클래스가 있습니다. NetworkStream이 바로 그 클래스 입니다.

GetStream 함수를 통하여 NetworkStream 객체를 반환합니다. 해당 객체로 통신을 수행합니다.

  • WriteAsync: 상대방에게 데이터를 송신할 때 사용됩니다.
  • ReadAsync: 상대방이 보낸 데이터를 수신할 때 사용됩니다.

NetworkStream는 바이트 데이터를 송/수신할 때 사용되며, 문자열 형식의 데이터를 전송하는 StreamReader, StreamWriter도 있습니다.

소켓 상태 확인 – Poll 함수, Available 속성

TcpClient에는 Client라는 Socket 타입의 속성이 있는데, 이 클래스에는 Poll 함수가 있습니다. Poll 함수는 소켓의 상태를 확인하는 함수 입니다. Poll 함수는 아래와 같이 정의되어 있습니다.

bool Poll(int microSeconds, SelectMode mode); // 인자1: 마이크로 초, 백만으로 입력해야 1초, 인자2: SelectMode

Poll 함수의 두 번째 인자에 입력되는 값에 따라 각기 다른 소켓의 상태를 확인 할 수 있습니다. SelectMode는 SelectRead, SelectWrite, SelectError enum값을 가집니다.

SelectRead는 아래 경우를 만족하면 Poll 함수가 true를 반환합니다.

  • Accept 함수가 성공할 때
  • 소켓에 수신된 데이터가 있을 때
  • 연결이 종료되었을 때

SelectWrite도 아래 경우 Poll 함수가 true를 반환합니다.

  • Connect 함수가 성공할 때
  • Socket으로 데이터를 전송 할 때

SelectError는 아래 경우입니다.

  • Connect 함수가 실패할 때
  • Out Of Band(OOB) 데이터 수신 감지할 때
  • 기타 소켓 오류 및 닫힘 상태일 때

Socket의 Available 속성은 네트워크에서 수신 되어 읽을 수 있는 데이터의 양을 가져옵니다. 그러니까 Poll 함수를 통해 소켓 상태를 확인했는데, 수신된 데이터가 없으면 연결이 종료되었다고 판단합니다.

실제 구현 프로그램

위 함수들을 이용하면 아래와 같이 채팅 서버를 만들 수 있습니다.


github