C# 비동기소켓 TCP 서버&클라이언트

콘솔 환경으로 구현한 에코 서버&클라이언트는 블로킹 모드여도 불편함이 없었지만

GUI 윈도우즈 환경에서는 사용자의 이벤트에 따라 독립적으로 실행되어야만 한다.

별다른 기능이 없는 프로그램인지라 멀티스레드로도 간단히 구현되겠지만,

비동기소켓을 이용하는 것이 흐름이 매끄럽다.

 

.NET의 비동기소켓을 이용한 TCP 서버 & 클라이언트

 

블로킹 모드와 비교해서 크게 달라지는 방식은

Begin메서드AsyncCallback 함수를 달아주고 콜백함수가 처리할 몫으로 End메서드를 추가해준다.

간단히 해서

"Begin메서드에 신호가오면 지정해준 메서드를 수행해라" 라고 위임해 버리는 것이다.

 

(프로젝트는 마법사로 생성하고 콘트롤 배치는 생략했다.)

 

서버 :

 

 

 

 

 

1. 폼이 로드되면

소켓생성 -> IEP생성 -> 소켓에 IEP바인드 -> 소켓 리슨 -> 소켓 BeginAccept(요청 대기)

 

2. BeginAccept에 신호가 들어오면(요청이 들어오면) 수락메서드 실행

소켓 재생성 -> EndAccept(수락) -> 환영 메세지 보내기 BeginSend

 

3. BeginSend에 신호가 들어오면 보내기 메서드 실행

소켓 재생성 -> EndSend(전송) -> 메세지 BeginReceive

 

4. BeginReceive에 신호가 들어오면 받기 메서드 실행

소켓 재생성 -> EndReceive(수신) -> 수신된 메세지 출력 -> 수신된 메세지 돌려주기 BeginSend (3번으로)

 

 

 

 

클라이언트 :

 

 

 

 

 

1.  연결 버튼이 눌러지면

소켓 생성 -> IEP 생성 -> IEP에 연결 BeginConnect(연결 요청전)

 

2. BeginConnect에 신호가 오면 연결 메서드 실행

소켓 재생성 -> EndConnect(연결 요청) -> 메세지 수신 BeginReceive

 

3. BeginReceive에 신호가 오면 받기 메서드 실행

소켓 재생성 -> EndReceive(수신) -> 수신된 메세지 출력

 

4. 보내기 버튼이 눌러지면

BeginSend(송신 전)

 

5. BeginSend에 신호가 오면 보내기 메서드 실행

소켓 재생성 -> EndSend(송신) -> BeginReceive (3번으로)

 

 

 

 

실행 화면 :

 

 

초기화면

 

 

 

연결 버튼 클릭

 

 

 

메세지 입력

 

 

 

'.NET > CSharp' 카테고리의 다른 글

C# 에서 mySQL 사용하기  (1) 2014.08.04
C# 문자열 string & StringBuilder  (0) 2014.01.24
C# 델리게이트 delegate  (0) 2014.01.08
C# 네트워크 UdpClient  (1) 2014.01.02
C# 네트워크 헬퍼클래스 TcpListener, TcpClient  (0) 2014.01.02