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*******************************************************/#endregionusing 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*******************************************************/#endregionusing 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////hostusing 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); } } } }}////clientusing 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的典型应用的实现方式做介绍,例子虽然 ...
随机推荐
- 通过BroadCast与service时时监听网络变化
首先需要一个service: 这里我定义了一个NetworkStateService,在这个service中我写了一个BroadcastReceiver用于监听网络状态发生改变的情况并在这个servi ...
- poj1298 The Hardest Problem Ever 简单题
链接:http://poj.org/problem?id=1298&lang=default&change=true 简单的入门题目也有这么强悍的技巧啊!! 书上面的代码: 很厉害有没 ...
- Java中的构造代码块
代码块 ----a静态代码块 ----b构造代码块 ----c普通代码块 执行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. a.静态代码块: 静态代码块 ...
- Ajax - ASP.NET MVC 4 系列
ASP.NET MVC 框架中包含一组 Ajax 辅助方法,可以用来创建表单和指向控制器操作的链接,它们是异步的,且不用编写任何脚本代码来实现程序的异步性,但需要引入脚本文件 jquer ...
- 如何导出和导入mysql数据(数据迁移)
. 导出数据库数据 mysqldump -uroot -p dp_db > dumpout.sql 其中 root是账户名 dp_db是需要导出的数据库名称 dumpout.sql存储导出的数据 ...
- C#动态编译并执行代码
先来张运行时截图: using System; using System.Collections.Generic; using System.ComponentModel; using System. ...
- 数据库中Schema和Database有什么区别
在MySQL中创建一个Schema好像就跟创建一个Database是一样的效果,在SQL Server和Orcal数据库中好像又不一样. 目前我只能理解,在mysql中 schema<==> ...
- ANDROID学习之路 转
版权声明:本文为 stormzhang 原创文章,可以随意转载,但必须在明确位置注明出处!!! 这篇博客背后的故事 一路走来很不容易,刚好知乎上被人邀请回答如何自学android编程, 就借这个机会在 ...
- java 线程安全 synchronized
一.线程安全问题: 并发编程的原则:设计并发编程的目的是为了使程序获得更高的执行效率,但绝不能出现数据一致性(数据准确)问题,如果并发程序连最基本的执行结果准确性都无法保证,那并发编程就没有任何意义. ...
- Window memcache 使用
一.memcache配置 1. 下载memcache 32位系统 1.2.5版本:http://static.runoob.com/download/memcached-1.2.5-win32-bin ...