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

时间: 2024-10-15 13:16:41

wcf 推送 与 广播的相关文章

springboot整合websocket实现一对一消息推送和广播消息推送

maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> 常量类 //webSocket相关配置 //链接地址 public static String WEBSOCKETPATHPERFIX = "/ws-push&

在 Asp.NET MVC 中使用 SignalR 实现推送功能 [转]

在 Asp.NET MVC 中使用 SignalR 实现推送功能 罗朝辉 ( http://blog.csdn.net/kesalin ) CC许可,转载请注明出处 一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请求或使用轮询技术来获取消息. 可访问其官方网站:https://github.com/SignalR/ 获取更多资讯. 二,实现机制

在 Asp.NET MVC 中使用 SignalR 实现推送功能

一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请求或使用轮询技术来获取消息. 二,实现机制 SignalR 的实现机制与 .NET WCF 或 Remoting 是相似的,都是使用远程代理来实现.在具体使用上,有两种不同目的的接口:PersistentConnection 和 Hubs,其中 PersistentConnection 是实现了长

Asp.NET MVC3 使用 SignalR 实现推送(接上)

一,Persistent Connection 示例教程 1,实现服务器端代码 1),编写服务器 PersistentConnection 代码 项目中 SignalR 目录下创建 PersistentConnection.cs 文件 using System; using System.Collections.Generic; using System.Threading.Tasks; using SignalR; namespace SignalTutorial.SignalR { publ

TP5中使用极光推送3.5.12

此前的文章中记录过在ThinkPHP3.2.3中使用极光推送的. 项目新使用了TP5的框架,遂就如此照搬迁移过来了. 先看TP5的目录架构说明: project  应用部署目录 ├─application           应用目录(可设置) │  ├─common             公共模块目录(可更改) │  ├─index              模块目录(可更改) │  │  ├─config.php      模块配置文件 │  │  ├─common.php      模块

atitit.web 推送实现方案集合

atitit.web 推送实现方案集合 1. 俩中模式 Push/Pull 1 2. 须要实现的特性 2 2.1. 推送消息广播. 2 2.2. 推送定向消息. 2 2.3. 提供连接上线前.上线.下线前.下线.发送消息等多种可处理事件. 2 2.4. 消息缓存机制.确保长轮询工作模式下不丢失消息. 2 2.5. client正常下线,服务端可马上感知. 2 2.6. client异常停止工作,服务端可定时检查并感知. 2 2.7. 以注冊通道应用的方式.让开发人员对框架功能进行扩展.实现自己的

极光推送使用实例(二) Android客户端

上一篇简单介绍了极光推送在Java服务端的实现,如果感兴趣的可以看一下极光推送使用实例(一)JAVA服务端.这篇文章介绍下极光推送在Android客户端的实现. JPush Android SDK 是作为 Android Serivice 长期运行在后台的,从而创建并保持长连接,保持永远在线的能力.JPush Android SDK 由于使用自定义协议,协议体做得极致地小,流量消耗非常地小.电量方面,JPush Android SDK 经过持续地优化,尽可能减少不必要的代码执行:并且,长期的版本

WEB消息推送-comet4j

一.comet简介: comet :基于 HTTP长连接的"服务器推"技术,是一种新的 Web 应用架构.基于这种架构开发的应用中,服务器端会主动以异步的方式向客户端程序推送数据,而不需要客户端显式的发出请求.Comet 架构非常适合事件驱动的 Web 应用,以及对交互性和实时性要求很强的应用,如股票交易行情分析.聊天室和 Web 版在线游戏等. 二.comet4j功能特性 推送消息广播. 推送定向消息. 提供连接上线前.上线.下线前.下线.发送消息等多种可处理事件. 消息缓存机制,确

android热门消息推送横向测评!

关于这个话题,已经不是什么新鲜事了.对于大多数中小型公司一般都是选择第三方的服务来实现.但是现在已经有很多提供推送服务的公司和产品,如何选择一个适合自己项目的服务呢?它们之间都有什么差别?在此为大家做了一个简单的调研,希望可以帮到大家. 简介: 手机推送服务是指服务器定向将信息实时送达手机的服务.推送服务,主要就是将最新资讯和最近的活动信息及时推送给用户,与用户保持互动,从而提高用户粘性,提升用户体验.例如,微信,新浪微博等APP的通知栏消息. 原理: 1)轮询(Pull)方式:应用程序应当阶段