原文地址: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. web新内容

    利用css完成如图的排版 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...

  2. C#循环语句练习2

    1.羽毛球拍15元,球3元,水2元,有200元,每一种至少买一件,问有几种买法? 2.洗发水15元,牙刷5元,香皂2元,有150元,每一种至少买一件,问有几种买法? 3.用100元钱买100只鸡,公鸡 ...

  3. Android深度探索HAL与驱动开发 第四章 源代码下载和编译

    前面说过Android移植主要就是Linux内核的移植,而Linux内核移植主要是Linux驱动的移植,所以为了开发和测试Linux驱动,有必要学习在Ubuntu Linux下如何搭建两套开发环境:A ...

  4. code forces 382 D Taxes(数论--哥德巴赫猜想)

    Taxes time limit per test 2 seconds memory limit per test 256 megabytes input standard input output ...

  5. imovie的快速入门

    iMovie 的边栏区域,可让您整理和选择资源库和事件. 在"资源库"列表中选择资源库或事件时,其媒体会显示在浏览器中. 浏览器 iMovie 中的区域,用于显示"资源库 ...

  6. 关于Unity中SteamVR_Controller.Input的错误

    当我在看某鸥的视频的时候,里面讲到用Unity做一个贪食蛇后,加入SteamVR插件,并且能用手柄控制蛇的移动.当我跟着上面一步一步做的时候,发现我代码都写完后,启动报错,而视频里面的老师讲的缺没有报 ...

  7. a标签与click的关系

    当点击浏览器a标签的时候,浏览器的默认机制如下: 1.触发a的click事件2.读取href属性的值3.如果是URI则跳转4.如果是javascript代码则执行该代码 下面我们一起来做一个实验: 我 ...

  8. 如何提高Linux操作系统的安全性 转自https://yq.aliyun.com/articles/24251?spm=5176.100239.blogcont24250.7.CfBYE9

    摘要: Linux系统不论在功能上.价格上或性能上都有很多优点,但作为开放式操作系统,它不可避免地存在一些安全隐患.关于如何解决这些隐患,为应用提供一个安全的操作平台,本文会告诉你一些最基本.最常用, ...

  9. .NET的ExcelOperate

    using System; using System.Web; using Excel = Microsoft.Office.Interop.Excel; namespace Comm { /// & ...

  10. 承接Hololens游戏外包

    近日,微软宣布第三批微软Hololens开发者版开始发货,包括:头显.头显手提包和一个遥控器.前两批开发者版本分别在今年3月30日和5月9日开始发货的. 第三批AR头显Hololens开发者版发货 虽 ...