wcf 推送 与 广播

////wcf 接口



#region << 版 本 注 释 >>

/****************************************************

* 文 件 名:IServices.cs

* Copyright(c) 2011-2012 JiangGuoLiang

* CLR 版本: 4.0.30319.235 

* 创 建 人:Server126

* 创建日期:2011-8-10 15:00:55

*******************************************************/

#endregion



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ServiceModel;



namespace Host

{

    [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ICallBackServices))]

    public interface IServices

    {

       /// <summary>

       /// 注册客户端信息

       /// </summary>

        [OperationContract(IsOneWay = false)]

        void Register();

        

    } //End Host



    public interface ICallBackServices

    {

        /// <summary>

        /// 服务像客户端发送信息(异步)

        /// </summary>

        /// <param name="Message"></param>

        [OperationContract(IsOneWay = true)]

        void SendMessage(string Message);

    }

} // End IServices

//////end 



////////实现接口



#region << 版 本 注 释 >>

/****************************************************

* 文 件 名:Services.cs

* Copyright(c) 2011-2012 JiangGuoLiang

* CLR 版本: 4.0.30319.235 

* 创 建 人:Server126

* 创建日期:2011-8-10 15:01:07

*******************************************************/

#endregion



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ServiceModel;

using System.Configuration;



namespace Host

{

    /// <summary>

    ///  实例使用Single,共享一个

    ///  并发使用Mutiple, 支持多线程访问(一定要加锁)

    /// </summary>

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]

    public class Services : IServices

    {

        public static readonly string SendMessageType = ConfigurationManager.ConnectionStrings["SendMessageType"].ToString();

        private static readonly object InstObj = new object();//单一实例

        //public static List<ICallBackServices> RegList = null;

        public static Dictionary<string, ICallBackServices> DicHost = null; //记录机器名称

        public static Dictionary<string, ICallBackServices> DicHostSess = null;//记录Sessionid

        public Services()

        {

            //RegList = new List<ICallBackServices>();

            DicHost = new Dictionary<string, ICallBackServices>();

            DicHostSess = new Dictionary<string, ICallBackServices>();

        }

        #region IServices 成员



        public void Register()

        {

            ICallBackServices client = OperationContext.Current.GetCallbackChannel<ICallBackServices>();

            string sessionid = OperationContext.Current.SessionId;//获取当前机器Sessionid--------------------------如果多个客户端在同一台机器,就使用此信息。

            string ClientHostName = OperationContext.Current.Channel.RemoteAddress.Uri.Host;//获取当前机器名称-----多个客户端不在同一台机器上,就使用此信息。

            OperationContext.Current.Channel.Closing += new EventHandler(Channel_Closing);//注册客户端关闭触发事件

            if (SendMessageType.ToUpper() == "SESSIONID")

            {

                DicHostSess.Add(sessionid, client);//添加

            }

            else

            {

                DicHost.Add(ClientHostName, client); //添加

            }

            //RegList.Add(client);//添加

        }

        void Channel_Closing(object sender, EventArgs e)

        {

            lock (InstObj)//加锁,处理并发

            {

                //if (RegList != null && RegList.Count > 0)

                //    RegList.Remove((ICallBackServices)sender); 

                if (SendMessageType.ToUpper() == "SESSIONID")

                {

                    if (DicHostSess != null && DicHostSess.Count > 0)

                    {

                        foreach (var d in DicHostSess)

                        {

                            if (d.Value == (ICallBackServices)sender)//删除此关闭的客户端信息

                            {

                                DicHostSess.Remove(d.Key);

                                break;

                            }

                        }

                    }

                }

                else

                {

                    if (DicHost != null && DicHost.Count > 0) //同上

                    {

                        foreach (var d in DicHost)

                        {

                            if (d.Value == (ICallBackServices)sender)

                            {

                                DicHost.Remove(d.Key);

                                break;

                            }

                        }

                    }

                }

            }

        }







        #endregion







    } //End Host

} //End Services





////host

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.ServiceModel;

using System.Threading;



namespace Host

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private static readonly object InstObj = new object();

        private static bool isval = true;

        private void Form1_Load(object sender, EventArgs e)

        {

            ServiceHost host = new ServiceHost(typeof(Services));

            host.Open();

            this.Text = "wcf starte aucceeded !";



            #region init listbox

            Thread thread = new Thread(new ThreadStart(delegate   ///监听所有客户端连接,并添加到ListBox控件里

            {

                lock (InstObj)//加锁

                {

                    while (true)

                    {



                        if (Services.SendMessageType.ToUpper() == "SESSIONID")

                        {

                            if (Services.DicHostSess != null || Services.DicHostSess.Count > 0)

                            {

                                this.Invoke(new MethodInvoker(delegate { this.listBox1.Items.Clear(); }));

                                foreach (var l in Services.DicHostSess)

                                {

                                    this.Invoke(new MethodInvoker(delegate

                                    {

                                        this.listBox1.Items.Add(l.Key);

                                    }));

                                }

                            }

                        }

                        else

                        {

                            if (Services.DicHost != null || Services.DicHost.Count > 0)

                            {

                                this.Invoke(new MethodInvoker(delegate { this.listBox1.Items.Clear(); }));

                                foreach (var l in Services.DicHost)

                                {

                                    this.Invoke(new MethodInvoker(delegate

                                    {

                                        this.listBox1.Items.Add(l.Key);

                                    }));

                                }

                            }

                        }

                        Thread.Sleep(1000 * 10);

                    }

                }

            }));

            thread.IsBackground = true;

            thread.Start();

            #endregion

        }



        private void button1_Click(object sender, EventArgs e)

        {

            if (Services.DicHostSess == null || Services.DicHostSess.Count > 0)

            {

                if (this.listBox1.SelectedItem != null)

                {

                    if (this.listBox1.SelectedItem.ToString() != "")

                    {

                        foreach (var d in Services.DicHostSess)

                        {

                            if (d.Key == this.listBox1.SelectedItem.ToString())

                            {

                                d.Value.SendMessage(string.Format("Time: {0} message {1}", DateTime.Now, "abc"));

                            }

                        }

                    }

                }

                else { MessageBox.Show("请选择要推送给哪台客户端"); return; }

            }

            if (Services.DicHost != null || Services.DicHost.Count > 0)

            {

                if (this.listBox1.SelectedItem != null)

                {

                    if (this.listBox1.SelectedItem.ToString() != "")

                    {

                        foreach (var d in Services.DicHost)

                        {

                            if (d.Key == this.listBox1.SelectedItem.ToString())

                            {

                                d.Value.SendMessage(string.Format("Time: {0} message {1}", DateTime.Now, "abc"));

                            }

                        }

                    }

                }

                else { MessageBox.Show("请选择要推送给哪台客户端"); return; }

            }

        }

        //广播方式

        private void button2_Click(object sender, EventArgs e)

        {

            if (Services.SendMessageType.ToUpper() == "SESSIONID")//类型

            {

                foreach (var d in Services.DicHostSess)

                {

                    d.Value.SendMessage(this.textBox1.Text);

                }

            }

            else

            {

                foreach (var d in Services.DicHost)

                {

                    d.Value.SendMessage(this.textBox1.Text);

                }

            }

        }



    }

}

////client



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ServiceModel;



namespace client

{

    class Program

    {

        static void Main(string[] args)

        {

            try

            {

                Console.WriteLine("create object...");

                CallBack back = new CallBack();

                InstanceContext context = new InstanceContext(back);

                ServiceReference1.ServicesClient client = new ServiceReference1.ServicesClient(context);

                Console.WriteLine("regist.....");

                client.Register();

                Console.WriteLine("aucceeded");

            }

            catch (Exception ex) { Console.WriteLine(ex.Message); }

            Console.ReadKey();

            client.Close();//关闭。

        }

    }

    class CallBack : ServiceReference1.IServicesCallback

    {

        #region IServicesCallback 成员



        public void SendMessage(string Message)

        {

            Console.WriteLine("[ClientTime{0:HHmmss}]Service Broadcast:{1}", DateTime.Now, Message);

        }



        #endregion

    }



}

  下载地址:http://download.csdn.net/source/3511270

你可能感兴趣的:(WCF)