原文地址: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

wcf 推送 与 广播的更多相关文章

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

    maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  2. springboot集成websocket点对点推送、广播推送

    一.什么都不用说,导入个依赖先 <dependency> <groupId>org.springframework.boot</groupId> <artif ...

  3. WCF推送

    http://www.cnblogs.com/server126/archive/2011/08/11/2134942.html

  4. 使用用WCF中的双工(Duplex)模式将广告图片推送到每个Winform客户端机子上

    参考资料地址:http://www.cnblogs.com/server126/archive/2011/08/11/2134942.html 代码实现: WCF宿主(服务端) IServices.c ...

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

    一,简介Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请 ...

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

    一,简介Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请 ...

  7. MVC 中使用 SignalR 实现推送功能

    MVC 中使用 SignalR 实现推送功能 一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Pus ...

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

    在 Asp.NET MVC 中使用 SignalR 实现推送功能 罗朝辉 ( http://blog.csdn.net/kesalin ) CC许可,转载请注明出处 一,简介 Signal 是微软支持 ...

  9. 史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式

    1.概述 通过上篇史上最全面的SignalR系列教程-1.认识SignalR文章的介绍,我们对SignalR技术已经有了一个全面的了解.本篇开始就通过SignalR的典型应用的实现方式做介绍,例子虽然 ...

随机推荐

  1. AFNetworking3.0 Https P12证书

    最近服务器由原来的ice中间件改为https.方便了和服务器交互时不用自己aes加密了. -之前服务器人员和我(IOS)都没有使用过https,所以https跑不通很难说是服务器没有配置好还是IOS这 ...

  2. Codeforces Round #361 Jul.6th B题 ☺译

    最近迈克忙着考前复习,他希望通过出门浮躁来冷静一下.迈克所在的城市包含N个可以浮躁的地方,分别编号为1..N.通常迈克在家也很浮躁,所以说他家属于可以浮躁的地方并且编号为1.迈克从家出发,去一些可以浮 ...

  3. Could not load type from string value 'DALMSSQL.DBSessionFactory,DALMSSQL'.

    问题: 原因: DAL.dll不在程序目录下        --调了老半天.

  4. mac电脑的使用

    1. control + command + a 截图 2. shift + command + g 前往 3.在 Mac OS X 中怎样获取当前文件夹的路径 原文网址:https://www.zh ...

  5. easycwmp的交叉编译

    原创作品,转载请注明出处 copyright:weishusheng   2015.3.18 email:642613208@qq.com 平台: Linux version 2.6.32-279.e ...

  6. rabbitmq, windows/linux, c/c++/node.js/golang/dotnet

    官网:http://www.rabbitmq.com/ zeromq 相当于 message backbone,而rabbitmq相当于message broker.有的应用系统中,二者并存. (1) ...

  7. HTML day0

    HTML 标签 <article>标签:标签规定独立的自包含内容.一篇文章应有其自身的意义,应该有可能独立于站点的其余部分对其进行分发. <article> 元素的潜在来源:  ...

  8. 游戏AI框架

  9. ORA-00907: 缺失右括号 整理解决

    ORA-00907: 缺失右括号 前言 最近在开发过程中使用oracle数据库,在程序中进行查询数据时遇到了“ORA-00907: 缺失右括号”的问题,但是如果直接把sql语句直接在数据库或PL/SQ ...

  10. C#调试心经续(转)

    断点篇 命中次数(Hit Counts) 右击断点,可以设置Hit Counts(命中次数),会弹出如下的对话框 当条件满足的时候断点会被命中(即即将被执行),这个命中次数是断点被命中的次数.默认是始 ...