////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
}
}
|