////wcf 接口
#region << 版 本 注 释 >>
#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();
}
public
interface
ICallBackServices
{
/// <summary>
/// 服务像客户端发送信息(异步)
/// </summary>
/// <param name="Message"></param>
[OperationContract(IsOneWay =
true
)]
void
SendMessage(
string
Message);
}
}
//////end
////////实现接口
#region << 版 本 注 释 >>
#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
Dictionary<
string
, ICallBackServices> DicHost =
null
;
public
static
Dictionary<
string
, ICallBackServices> DicHostSess =
null
;
public
Services()
{
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;
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);
}
}
void
Channel_Closing(
object
sender, EventArgs e)
{
lock
(InstObj)
{
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
}
}
////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
}
}