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 } } |
wcf 推送 与 广播的更多相关文章
- springboot整合websocket实现一对一消息推送和广播消息推送
maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- springboot集成websocket点对点推送、广播推送
一.什么都不用说,导入个依赖先 <dependency> <groupId>org.springframework.boot</groupId> <artif ...
- WCF推送
http://www.cnblogs.com/server126/archive/2011/08/11/2134942.html
- 使用用WCF中的双工(Duplex)模式将广告图片推送到每个Winform客户端机子上
参考资料地址:http://www.cnblogs.com/server126/archive/2011/08/11/2134942.html 代码实现: WCF宿主(服务端) IServices.c ...
- Asp.NET MVC 中使用 SignalR 实现推送功能
一,简介Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请 ...
- 在 Asp.NET MVC 中使用 SignalR 实现推送功能
一,简介Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请 ...
- MVC 中使用 SignalR 实现推送功能
MVC 中使用 SignalR 实现推送功能 一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Pus ...
- 在 Asp.NET MVC 中使用 SignalR 实现推送功能 [转]
在 Asp.NET MVC 中使用 SignalR 实现推送功能 罗朝辉 ( http://blog.csdn.net/kesalin ) CC许可,转载请注明出处 一,简介 Signal 是微软支持 ...
- 史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式
1.概述 通过上篇史上最全面的SignalR系列教程-1.认识SignalR文章的介绍,我们对SignalR技术已经有了一个全面的了解.本篇开始就通过SignalR的典型应用的实现方式做介绍,例子虽然 ...
随机推荐
- cocoapods版本更新
1.下载某些三方库时,pod install会出现错误 $ pod install Analyzing dependencies [!] The version of CocoaPods used t ...
- HTML5 3D爱心动画 晚来的七夕礼物
在线演示源码下载 这么好看的HTML5爱心动画,我们当然要把源代码分享给大家,下面是小编整理的源代码,主要是HTML代码和CSS代码. HTML代码: <div class=’heart3d’& ...
- Apache2.4.6服务器安装及配置
一.系统环境 系统版本:Aliyun Linux release 5.7 内核版本:2.6.18-274.el5 apr版本:apr-1.4.8 apr-util版本:apr-util-1.5.2 p ...
- Java中的抽象类
含有抽象方法的类,抽象方法即用abstract修饰的方法,即父类只知道其子类应该含有该方法,但无法知道子类如何实现这些方法 抽象类限制规定子类必须实现某些方法,但不关注实现细节 抽象类中可以包含普通方 ...
- 汇编语言基础 debug的使用
-r 查看,改变CPU寄存器的内容 -r 加上寄存器名 在:后输入要写入的数据后 完成更改 debug 随着CS IP的改变 对应的汇编指令也不同 -r ip -r cs修改 ip cs 的值 d 段 ...
- 跟我学Windows Azure 一 创建Windows Azure试用账号
我在网上看了很多教程,很大部分都是申请的是国外或者是香港的试用账号,而国内是由世纪互联所代理的,他的申请方式与VS2013的部署设置或多或少还是有些出入,这里我先跟大家一起过一下,在国内如何申请一个w ...
- Python核心编程练习题笔记: type(a)==type(b) 和 type(a) is type(b)的差别
前式需要找到类型的ID(相当于门牌号),然后“敲门”取得类型值 后式只需要找到类型的ID,而不需要再去“敲门”获得类型具体值.在一个“门牌号”内只可能有一个值,因此就不用明知故问了.因此后式比前式少了 ...
- 关于eclipse保存代码很慢,提示the user operation is waiting的问题
关于eclipse保存代码很慢,提示the user operation is waiting的问题 首先 去掉 project - build Automaticlly 然后 project-> ...
- h5的拖放(drag和drop)
被拖曳元素发生的事件=== ondragstart:拖拽元素开始被拖拽的时候触发 ondragend:拖拽完成后触发 目标元素发生的事件=== ondragenter:拖曳元素进入目标元素的时候触发 ...
- Head First 设计模式之命令模式(CommandPattern)
前言: 本章会将封装带入到一个全新的境界,把方法调用封装起来.通过封装方法调用,把运算块包装成形.调用此运算的对象不需要知道事情是如何进行的,只要知道如何使用包装形成的方法来完成它就ok了. 1 现实 ...