[C#] WCF 초간단 예제

2014.11.14 20:13



WCF(Windows Communication Foundation) 

나도 잘 몰라서 설명을 잘 못하겠다.

그래도 우선 아래 소스는 이해가 갔다.


프로세스간 통신을 하려면 이전에는 여러가지 방법이 있었다.

그런데 WCF는 그것을 간단하게(?) 해결하여준다.


WCF를 이해하기 위해서는 몇가지 알아야할 개념이 있다.

난 복잡한 것을 잘 모르니까 그냥 내가 이해한 대로 나를 위해 적어본다.


WCF로 프로세스간 통신을 하기위해서는 서버와 클라이언트가 필요하다.

WCF는 서버의 함수들을 클라이언트에서 호출할 수 있게 해준다.


서버의 함수를 클라이언트에서 호출을 할 수 있게 하기 위해서 해야되는 몇가지 작업이 있다.

우선 EndPoint라는 것을 서버에도 클라이언트에도 만들어주어야한다.

어떤 프로세스간 통신을 하더라도 서로 통신을 하기위해 무언가 준비해야된다.

WCF에서 프로세스간 통신을 하기위해서 반드시 필요한 것이 EndPoint이고

EndPont는 서버와 클라이언트간에 통신을 하기위한 양쪽 터널의 끝점같은 것이다.

양쪽 EndPoint를 제대로 설정해야 제대로 통신할 수 있다.


EndPoint는 ABC로 구성되어있다.

A는 Address, B는 Binding, C는 Contract로

Address는 어디에 접속할지를 설정한다.

Binding은 어떻게 접속할지를 설정한다.

Contract는 접속에서 무엇을 할지를 설정한다.


음... 설명하려했는데 이 설명으로 WCF를 이해하는 사람이 있으면 그 사람은 분명히 천재이다. ㅜㅜ

여하튼 WCF는 서버쪽 함수를 클라이언트 쪽에서 쉽게 호출할 수 있게 만들어 준다는 것만을 알아도 WCF를 반이상 안거라고 생각한다.


기본적으로 wCF 관련 자료를 인터넷에서 검색하면 이것저것 설정해야되는 것이 많은데 개인적으로는 아래와 같이 특별히 설정하지 않고 소스에서 Address나 Binding을 처리하는 것이 좋다.



WCF Server 쪽 소스


버튼 두개를 폼에 추가 한다.

솔루션 탐색기의 참조에서 오른쪽 클릭으로 참조 추가를 하여 선택하여

.NET 탭에서 System.ServiceModel을 선택하여 확인 버튼을 누른다.

그리고 소스를 열어 아래 내용들을 추가한다.



using System;
using System.Windows.Forms;

using System.ServiceModel;

namespace wcfSimpleServer
{
    public partial class Form1 : Form
    {
        ServiceHost host;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            // Address 
            string address = "net.tcp://localhost:8080/myAddress";

            // Binding : TCP 사용
            NetTcpBinding binding = new NetTcpBinding();

            // Service Host 만들기
            host = new ServiceHost(typeof(MyService));

            // End Point 추가
            host.AddServiceEndpoint(typeof(IMyContract), binding, address);

            // Service Host 시작
            host.Open();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            // Service Host 종료
            host.Close();

        }
    }

    // Client 쪽에서 호출될 함수 Interface
    [ServiceContract]
    public interface IMyContract
    {
        [OperationContract]
        string Hello(string name);
    }

    // 실제로 Client에서 호출될 함수
    public class MyService : IMyContract
    {
        public string Hello(string name)
        {
            return "Hello " + name + "!";
        }
    }
}





WCF 클라이언트 쪽 소스


버튼 한개를 폼에 추가 한다.

솔루션 탐색기의 참조에서 오른쪽 클릭으로 참조 추가를 하여 선택하여

.NET 탭에서 System.ServiceModel을 선택하여 확인 버튼을 누른다.

그리고 소스를 열어 아래 내용들을 추가한다.




using System;
using System.Windows.Forms;

using System.ServiceModel;

namespace wcfSimpleClient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Text = "";

            ChannelFactory<IMyContract> factory = new ChannelFactory<IMyContract>();

            // Address
            string address = "net.tcp://localhost:8080/myAddress";
            factory.Endpoint.Address = new EndpointAddress(address);

            // Binding : TCP 사용
            factory.Endpoint.Binding = new NetTcpBinding();

            // Contract 설정
            factory.Endpoint.Contract.ContractType = typeof(IMyContract);

            // Channel Factory 만들기
            IMyContract channel = factory.CreateChannel();

            // Server 쪽 함수 호출
            string result = channel.Hello("World");

            // Close Channel
            ((ICommunicationObject)channel).Close();

            this.Text = result;
        }

        // Server 쪽 함수 호출용 Interface
        [ServiceContract]
        public interface IMyContract
        {
            [OperationContract]
            string Hello(string name);
        }
    }
}




서버쪽 프로그램 실행하여 버튼1 클릭하고

클라이언트쪽 프로그램 실행하여 버튼1 클릭하면 

클라이언트쪽 폼의 캡션에 "Hello World!"가 출력되면 성공


단언컨데 이 소스보다 간단한 WCF 소스는 별로 없을 것 같다.




Posted by 떡잎
BLOG main image
프로그래밍 공부하면서 써가는 개인 노트 (따라서 여기에 씌여있는 소스의 신빙성을 보장 못함 -.-;;) 이 블로그 보면서 틀린 점이 있으면 꼬옥 알려주세요. by 띠리

공지사항

카테고리

분류 전체보기 (323)
Win32 SDK 초보 (27)
통신관련 (11)
MFC TIP (20)
C/C++ TIP (10)
개발기타 (10)
링크 (2)
견물생심 (24)
이것저것 (8)
용어메모 (3)
데이터베이스 (32)
비주얼 베이직 (10)
하드웨어 (3)
C# (42)
Xcode (3)
델파이 (82)
홈페이지 (5)
MindStorm (0)
낙서 (5)
스크래치 (0)
기타 (6)
아두이노 (1)
라즈베리파이 (2)
안드로이드 (6)
파이썬 (0)
WEB (2)
Total : 987,326
Today : 404 Yesterday : 409