article search result of 'WCF' : 3

  1. 2012.05.17 [WCF] 분산서버 데모 (77)
  2. 2012.05.12 [WCF] 간단한 채팅 샘플 (61)
  3. 2011.12.19 [WCF] WCF의 기초 통신 (177)

[WCF] 분산서버 데모

 

 

Yamecoder 야매코더_
분류없음 2012.05.17 10:17

[WCF] 간단한 채팅 샘플

ㅁㅁㅁ

 

 

 

 

서버측(ServerSide [Host])

Interface

using System.ServiceModel;

namespace TESTWCF_2_Server
{
    //콜백할 인터페이스 이다. 곧 Client 가 된다..
    [ServiceContract]
    public interface ISomeCallback
    {
        [OperationContract]
        void SendMessageToClient(string someStr);
    }

    //WCF host에서 구현할  인터페이스 이다.
    //ServiceContract 에 콜백 인터페이스를 등록 하였다.

    [ServiceContract(CallbackContract = typeof(ISomeCallback))]
    public interface ISome
    {
        [OperationContract]
        void StartService();

        [OperationContract]
        void SendMessageToServer(string someStr);
    }
}
 

 

 

 

구현

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using JUtil;

namespace TESTWCF_2_Server
{
    /// <summary>
    /// ISome 을 구현한 클래스이다.
    /// 클라이언트 구현시 서비스 참조의 명세가 되는 클래스 이다.
    /// ServiceBehavior 의 속성을 제어 할수 있다.
    /// </summary>


    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single , ConcurrencyMode = ConcurrencyMode.Single)]
    public class Service : ISome , IDisposable
    {
        /// <summary>
        /// 편의를 위해 싱글턴으로 만든다.
        /// </summary>

        private static Service inst = null;
        public static Service getInst()
        {
            if(inst == null)
            {
                inst = new Service();
            }
            return inst;
        }

        //클라이언트들을 모을 배열이다.
        private List<ISomeCallback> clients;
        private Service()
        {
            inst = this;
            TraceBox.trace("Start Service");
            clients = new List<ISomeCallback>();
        }

        //접속
        //클라이언트들이 접속되자 마자 실행하게될 메소드
        //접속한 클라이언트 정보를 받아 클라이언트 배열에 넣는다.
&#
        public void StartService()
        {
            OperationContext ctx = OperationContext.Current;
            ISomeCallback client = ctx.GetCallbackChannel<ISomeCallback>();
            clients.Add(client);

            //클라이언트 들은 IClientChannel로 타입캐스팅을 하여
            //각종 정보를 얻는다.668;

            //&#44033;&#51333; &#51221;&#48372;&#47484; &#50619;&#45716;&#45796;.
            IClientChannel channel = client as IClientChannel;
            TraceBox.trace("info : client Add" + Environment.NewLine , channel.SessionId);
        }

        //전송
        //서버가 클라이언트들에게 전송송/
&#53364;&#46972;&#51060;&#50616;&#53944;&#46308;&#50640;&#44172; &#51204;&#49569;/
        public void brodcast(string message)
        {
            foreach (ISomeCallback client in clients)
            {
                //클라이언트 들은 IClientChannel로 타입캐스팅을 하여
                //상태 체크를 한다. 그중 접속이 꺼지거나,
                //전송을 할수 없는 상황을 체크하여 활성 클라이언트만 골라낼수 있다
                // cf)channel.State

                IClientChannel channel = client as IClientChannel;
                client.SendMessageToClient(message);

            }
        }

        public void Dispose()
        {
        }


        public void SendMessageToServer(string someStr)
        {
            TraceBox.trace(someStr);
        }
    }
}
 

 

 

 

 

using System;
using System.Windows;
using System.ServiceModel;
using System.ServiceModel.Description;
using JUtil;
namespace TESTWCF_2_Server
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        ServiceHost host;
        protected override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);
            TraceBox.InitailizeTraceBOX(textBox1);

            /**
             *  Tcp 바인딩을 선언한다.             * */

            NetTcpBinding binding = new NetTcpBinding();
            binding.Security.Mode = SecurityMode.None;
            binding.ReliableSession.Enabled = false;

            /*
             * ServiceMetadataBehavior 를 선언하여 서비스 참조를 할수있도록 한다* */

            ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
            behavior.HttpGetEnabled = true;

            //WCF host 생성//;
            host = new ServiceHost(
                typeof(Service),
                new Uri("http://192.168.0.7:8507/wcf"),
                new Uri("net.tcp://192.168.0.7/wcf")
                );
            host.AddServiceEndpoint(typeof(ISome), binding, "");

            ////behavior 를 등록한다;
            host.Description.Behaviors.Add(behavior);
            host.Open();
        }

        protected override void OnClosed(EventArgs e)
        {
            host.Close();
            base.OnClosed(e);
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Service.getInst().brodcast(ChatBox.Text);
        }
    }
}
 

 

 

클라이언트(ClientSide)

 

 

using System;
using System.Windows;
using System.ServiceModel;
using TESTWCF_2_Client.SomeService;
using JUtil;
namespace TESTWCF_2_Client
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        SomeClient proxy;
        protected override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);
            TraceBox.InitailizeTraceBOX(textBox1);


            /**
             * app.config 를 이용하지 않기 위해 아래와 같이 binding 을 따로 선언한다.
             *  => 차후 동적으로 WCF 호스트를 열기 위해서 이다.
             * */*/

            NetTcpBinding bindig = new NetTcpBinding();
            bindig.Security.Mode = SecurityMode.None;
            bindig.ReliableSession.Enabled = false;

            //콜백 인스턴스를 구현한 클래스를 아래와 같이 적용한다;
            InstanceContext ctx2 = new InstanceContext(new SomeCallbackHandler());


            /**
             *  SomeClient 는 서비스참조에 의해 자동으로 생성된 클래스로서
                DuplexClientBase<ISome> 을 상속하고
                ISome 을 구현 한다
                (정의로 이동) 하여 내용을 볼수 있다.
             * */*/

            proxy = new SomeClient(
                ctx2,
                bindig,
                new EndpointAddress("net.tcp://192.168.0.7/wcf"));



            //호스트에 접속한다. 만약 호스트가 실행중이 아니라면 Exception..
            proxy.Open();
            proxy.StartService();

        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            //프록시를 통하여 호스트(Server) 로 메시지를 보낸다;
            proxy.SendMessageToServer(ChatBox.Text);
        }
    }
   
    /// <summary>
    /// 호스트 로 부터 메시지를 받을 콜백 클래스
    /// </summary>
>
    class SomeCallbackHandler : SomeService.ISomeCallback
    {
        public void SendMessageToClient(string someStr)
        {
            TraceBox.trace(someStr);
        }
    }
}
 

 

 

* 서비스 호스트 참조법

 

참조를 위해선 ServiceMetadataBehavior 를 위의 샘플 처럼 구현을 해야 한다.

우선 위와 같이 서버 호스트를 실행 시킨다.

 

[참조] 오른쪽버튼 -> 서비스참조 추가

에서 서버의 바인딩중 선언한 http 주소를 입력한다

 

 

 

WCF.zip

Yamecoder 야매코더_
C# 2012.05.12 15:14

[WCF] WCF의 기초 통신



기본적인 통신으로서 Http 를 이용하겠다.


서버측 인터페이스 (DLL 으로 뽑을것)
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace StikusFrameServiceInterFace
{
    [ServiceContract]
    public interface ISFServerProtocol
    {
        [OperationContract]
        string StikusFrameAuth(string AuthXmlDataString);


        [OperationContract]
        string StikusFrameClose(string AuthXmlDataString);
        
    }
}


서버측 구현

using System; using System.Collections.Generic; using System.Linq; using System.Text; using StikusFrameServiceCore.JUtil.Trace; using StikusFrameServiceInterFace; using System.ServiceModel; namespace StikusFrameServiceCore { public class StikusFrameServiceStart { ServiceHost SFService; public StikusFrameServiceStart() { JTrace.trace("start!"); SFService = new ServiceHost( typeof(SFServiceProtocol), //ISFServerProtocol 를 구현한 클래스 new Uri("http://wow/wowblahblah"));

SFService.AddServiceEndpoint( typeof(ISFServerProtocol) , new BasicHttpBinding() , ""); SFService.Open(); } public void CloseSFService() { SFService.Close(); } } }




클라이언트 ( 위의 인터페이스를 .DLL 으로 공유 한다. )

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ServiceModel;
using System.ServiceModel.Description;
using StikusFrameServiceInterFace;
namespace WCFClient
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        protected override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);

            Uri uri = new Uri("http://wow/wowblahblah");
            ServiceEndpoint ep = new ServiceEndpoint(
                ContractDescription.GetContract(typeof(ISFServerProtocol)) ,
                new BasicHttpBinding() ,
                new EndpointAddress(uri));

            ChannelFactory<ISFServerProtocol> factory =
                new ChannelFactory<ISFServerProtocol>(ep);

            ISFServerProtocol proxy = factory.CreateChannel();
            string result = proxy.StikusFrameAuth("auth");
            Console.WriteLine(result);
        }
    }
}




클라이언트 배포시 보안상의 이유호 서버측의 인터페이스만 DLL 로 공유하는 방법을 선택한다.

Yamecoder 야매코더_
tags : WCF
C# 2011.12.19 10:02
Powerd by Tistory, designed by criuce
rss