zoukankan      html  css  js  c++  java
  • wcf 推送 与 广播

    原文地址:http://blog.csdn.net/is_zhoufeng/article/details/7641234

    ////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

  • 相关阅读:
    fwt
    fft,ntt
    loj6077
    高维前缀和
    hihocoder 1496 寻找最大值
    HDU 5977 Garden of Eden
    扩展crt
    有标号的DAG计数I~IV
    BZOJ 3160 万径人踪灭
    Codeforces Round #524 (Div. 2) F
  • 原文地址:https://www.cnblogs.com/footleg/p/4124067.html
Copyright © 2011-2022 走看看