140 likes | 331 Views
Chapter 7 Graphical User Interface. 소켓 프로그래밍. Graphical User Interface. Introduction 비동기 소켓 윈도우 폼 Echo 서버 GUI Echo 클라이언트 GUI SMTP 클라이언트 GUI. Introduction. 그래픽 인터페이스를 통한 상호작용 Event-driven 프로그래밍 컴포넌트를 클릭 / 선택하여 이벤트 발생 이벤트에 대해 수행할 작업과 관련된 코드 입력 사용자가 일으킨 이벤트에 의해 프로그램 흐름이 결정
E N D
Chapter 7Graphical User Interface 소켓 프로그래밍
Graphical User Interface • Introduction • 비동기 소켓 • 윈도우 폼 • Echo 서버 GUI • Echo 클라이언트 GUI • SMTP 클라이언트 GUI
Introduction • 그래픽 인터페이스를 통한 상호작용 • Event-driven 프로그래밍 • 컴포넌트를 클릭/선택하여 이벤트 발생 • 이벤트에 대해 수행할 작업과 관련된 코드 입력 • 사용자가 일으킨 이벤트에 의해 프로그램 흐름이 결정 • GUI는 Visual Studio 2008 또는 Visual C# 2008 Express Edition을 이용하여 설계 가능
비동기 소켓 • 지금까지 사용된 Accept(), Read(), Write() 등의 메서드는blocking 메서드 • Blocking – 실행을 완료할 때까지 다른 모든 작업을 수행하지 못하게 막는 것을 의미 • Accept() • 접속이 성립되어 클라이언트의 객체가 반환될 때까지 busy waiting을 하며 다른 모든 태스크가 수행되지 못하도록 막아놓고 대기 • Read(), Write() • 상대방이 데이터를 보낼 때까지 또는 상대방이 읽을 준비가 될 때까지 대기 • 이러한 blocking은 콘솔 응용 프로그램에서는 큰 문제가 되지 않을 수도 있겠지만, GUI기반 프로그램에서는 freezing 현상이 발생 • 전체 프로그램이 멈추지 않고 수행을 계속할 수 있도록 하는 방법이 필요 • 프로그램은 접속요청에 대한 busy waiting을 할 필요가 없으며, 실제 접속요청이 들어올 때 수행을 재개하도록 함으로써 해결
비동기 소켓 • 비동기메서드를 가지는 클래스 • Socket • TcpListener • TcpClient • NetworkStream • UdpClient • 비동기메서드의 이름 앞에는 Begin 또는 End가 붙음 • Begin<Method Name> : 비동기 초기화 메서드 • End<Method Name> : 비동기 종료 메서드 • Example : BeginAcceptTcpClient(), EndAcceptTcpClient()
비동기 소켓 • 비동기메서드 호출 • 비동기메서드를 호출한 뒤에비동기 작업이 준비가 되었을 때, 이를 처리할 메서드를 미리 정의해야 함. 이때 정의할 메서드는IAsyncResult라는 인자를 가짐 • 정의된 메서드는비동기 작업이 준비되었을 때 callback 대리자를 통해서 호출됨 • 즉, 비동기메서드의 호출은 이 callback 대리자를 인자로 하여 호출을 하고, 다른 작업을 진행하다가 호출한 비동기 작업이 준비가 되면 callback 대리자에 의해 해당 작업을 처리할 메서드를 호출하는 방식을 가짐 • IAsyncResult • 비동기 작업의 상태를 나타내며 비동기 초기화 메서드Begin<Method Name>의 반환 형식 • 또한,callback 대리자를 통해 호출되는 메서드로 전달되어 이후, 비동기 종료 메서드End<Method Name>로 전달됨
비동기 소켓 • 핵심 코드 publicstaticvoidOnClientConnect(IAsyncResultaResult) { TcpListener listener = (TcpListener)aResult.AsyncState; TcpClient client = listener.EndAcceptTcpClient(aResult); ... } publicstaticvoid Main() { ... // Accept the client asynchronously IAsyncResultaResult = lst.BeginAcceptTcpClient( newAsyncCallback(OnClientConnect), lst); // Wait for a connection before continue aResult.AsyncWaitHandle.WaitOne(); ... } • 예제 프로그램 : AsyncEchoServer, StateHolder.cs
윈도우 폼 • GUI기반 프로그램을 만들기 위해서 새 프로젝트를 생성 • 콘솔 응용 프로그램이 아닌 Windows Form 응용 프로그램을 선택 • 프로젝트 생성 후 폼 디자인 화면
윈도우 폼 • 윈도우 컴포넌트의 추가 • 도구상자로부터 drag-and-drop 방식으로 폼에 컴포넌트 추가 • 도구상자에서 컴포넌트를 선택하여 폼에 그리는 방식으로 추가
윈도우 폼 • 컴포넌트 속성과 이벤트
이벤트 발생 ... 대기 시스템 메시지 큐 애플리케이션 메시지 큐 #3 처리 애플리케이션 메시지 큐 #2 처리 애플리케이션 메시지 큐 #1 윈도우 GUI 애플리케이션 • 메시지 구동 구조
Echo 서버 GUI • 폼 디자인 • 예제 코드 : ServerForm.cs
Echo 클라이언트 GUI • 폼 디자인 • 코드 예제 : ClientForm.cs
SMTP 클라이언트 GUI • 폼 디자인 • 코드 예제 : SMTPClientFform.cs