服务端文件:
服务端界面如下 :
Publisher.cs文件代码如下:
1
using
System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.ServiceModel;
6 using System.Windows.Forms;
7
8 namespace Publishers
9 {
10 [ServiceContract(CallbackContract = typeof (IPublisherEvents))]
11 public interface IPublisher
12 {
13 [OperationContract]
14 void Subscriber(Guid id); // 订阅
15 [OperationContract]
16 void UnSubscriber(Guid id); // 取消订阅
17 }
18
19 public interface IPublisherEvents
20 {
21 [OperationContract(IsOneWay = true )]
22 void Notify(); // 发布消息
23
24 }
25
26 [ServiceBehavior]
27 public class Publisher:IPublisher
28 {
29
30 public void Subscriber(Guid id)
31 {
32 IPublisherEvents callback = OperationContext.Current.GetCallbackChannel < IPublisherEvents > ();
33 FormMain form = Application.OpenForms[ 0 ] as FormMain;
34 form.AddSubscriber(id,callback);
35 }
36
37 public void UnSubscriber(Guid id)
38 {
39 IPublisherEvents callback = OperationContext.Current.GetCallbackChannel < IPublisherEvents > ();
40 FormMain form = Application.OpenForms[ 0 ] as FormMain;
41 form.RemoveSubscriber(id,callback);
42 }
43
44 }
45 }
46
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.ServiceModel;
6 using System.Windows.Forms;
7
8 namespace Publishers
9 {
10 [ServiceContract(CallbackContract = typeof (IPublisherEvents))]
11 public interface IPublisher
12 {
13 [OperationContract]
14 void Subscriber(Guid id); // 订阅
15 [OperationContract]
16 void UnSubscriber(Guid id); // 取消订阅
17 }
18
19 public interface IPublisherEvents
20 {
21 [OperationContract(IsOneWay = true )]
22 void Notify(); // 发布消息
23
24 }
25
26 [ServiceBehavior]
27 public class Publisher:IPublisher
28 {
29
30 public void Subscriber(Guid id)
31 {
32 IPublisherEvents callback = OperationContext.Current.GetCallbackChannel < IPublisherEvents > ();
33 FormMain form = Application.OpenForms[ 0 ] as FormMain;
34 form.AddSubscriber(id,callback);
35 }
36
37 public void UnSubscriber(Guid id)
38 {
39 IPublisherEvents callback = OperationContext.Current.GetCallbackChannel < IPublisherEvents > ();
40 FormMain form = Application.OpenForms[ 0 ] as FormMain;
41 form.RemoveSubscriber(id,callback);
42 }
43
44 }
45 }
46
服务窗体代码 FormClient.cs:
1
using
System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9 using System.ServiceModel;
10
11 namespace Publishers
12 {
13 public partial class FormMain : Form
14 {
15 private ServiceHost host = null ;
16 public FormMain()
17 {
18 InitializeComponent();
19 host = new ServiceHost( typeof (Publishers.Publisher));
20 host.Open();
21 }
22
23 Dictionary < Guid, IPublisherEvents > dic = new Dictionary < Guid, IPublisherEvents > ();
24
25 public void AddSubscriber(Guid id,IPublisherEvents callback)
26 {
27 if ( ! dic.ContainsKey(id))
28 {
29 dic.Add(id,callback);
30 lsbSubscribers.Items.Add(id);
31 }
32 }
33
34 public void RemoveSubscriber(Guid id,IPublisherEvents callback)
35 {
36 if (dic.ContainsKey(id))
37 {
38 dic.Remove(id);
39 lsbSubscribers.Items.Remove(id);
40 }
41 }
42
43 private void btnNotify_Click( object sender, EventArgs e)
44 {
45 foreach (KeyValuePair < Guid, IPublisherEvents > pair in dic)
46 {
47 pair.Value.Notify();
48 }
49 }
50 }
51 }
52
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9 using System.ServiceModel;
10
11 namespace Publishers
12 {
13 public partial class FormMain : Form
14 {
15 private ServiceHost host = null ;
16 public FormMain()
17 {
18 InitializeComponent();
19 host = new ServiceHost( typeof (Publishers.Publisher));
20 host.Open();
21 }
22
23 Dictionary < Guid, IPublisherEvents > dic = new Dictionary < Guid, IPublisherEvents > ();
24
25 public void AddSubscriber(Guid id,IPublisherEvents callback)
26 {
27 if ( ! dic.ContainsKey(id))
28 {
29 dic.Add(id,callback);
30 lsbSubscribers.Items.Add(id);
31 }
32 }
33
34 public void RemoveSubscriber(Guid id,IPublisherEvents callback)
35 {
36 if (dic.ContainsKey(id))
37 {
38 dic.Remove(id);
39 lsbSubscribers.Items.Remove(id);
40 }
41 }
42
43 private void btnNotify_Click( object sender, EventArgs e)
44 {
45 foreach (KeyValuePair < Guid, IPublisherEvents > pair in dic)
46 {
47 pair.Value.Notify();
48 }
49 }
50 }
51 }
52
App.config配置文件如下:
1
<?
xml version="1.0" encoding="utf-8"
?>
2 < configuration >
3 < system.serviceModel >
4 < services >
5 < service name ="Publishers.Publisher" behaviorConfiguration ="tcpBehavior" >
6 < endpoint address ="" binding ="netTcpBinding" contract ="Publishers.IPublisher" />
7 < endpoint address ="mex" binding ="mexTcpBinding" contract ="IMetadataExchange" />
8 < host >
9 < baseAddresses >
10 < add baseAddress ="net.tcp://localhost:8000/" />
11 </ baseAddresses >
12 </ host >
13 </ service >
14 </ services >
15 < behaviors >
16 < serviceBehaviors >
17 < behavior name ="tcpBehavior" >
18 < serviceMetadata />
19 </ behavior >
20 </ serviceBehaviors >
21 </ behaviors >
22 </ system.serviceModel >
23 </ configuration >
2 < configuration >
3 < system.serviceModel >
4 < services >
5 < service name ="Publishers.Publisher" behaviorConfiguration ="tcpBehavior" >
6 < endpoint address ="" binding ="netTcpBinding" contract ="Publishers.IPublisher" />
7 < endpoint address ="mex" binding ="mexTcpBinding" contract ="IMetadataExchange" />
8 < host >
9 < baseAddresses >
10 < add baseAddress ="net.tcp://localhost:8000/" />
11 </ baseAddresses >
12 </ host >
13 </ service >
14 </ services >
15 < behaviors >
16 < serviceBehaviors >
17 < behavior name ="tcpBehavior" >
18 < serviceMetadata />
19 </ behavior >
20 </ serviceBehaviors >
21 </ behaviors >
22 </ system.serviceModel >
23 </ configuration >
现在看客户端:
客户端窗体
在客户端添加对服务的引用
窗体代码:
1
using
System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9 using Subscribers.localhost;
10 using System.ServiceModel;
11 using System.Threading;
12
13 namespace Subscribers
14 {
15 public partial class FormClient : Form,IPublisherCallback
16 {
17 PublisherClient proxy = null ;
18
19 public FormClient()
20 {
21 InitializeComponent();
22 InstanceContext instance = new InstanceContext( this );
23 proxy = new PublisherClient(instance);
24 }
25
26 private Guid id = Guid.NewGuid();
27
28 private void button1_Click( object sender, EventArgs e)
29 {
30 proxy.Subscriber(id);
31 }
32
33 public void Notify()
34 {
35 MessageBox.Show( string .Format( " SubScriber : Thread {0} " , Thread.CurrentThread.GetHashCode()));
36 }
37
38 private void button2_Click( object sender, EventArgs e)
39 {
40 proxy.UnSubscriber(id);
41 }
42
43 }
44 }
45
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Data;
5 using System.Drawing;
6 using System.Linq;
7 using System.Text;
8 using System.Windows.Forms;
9 using Subscribers.localhost;
10 using System.ServiceModel;
11 using System.Threading;
12
13 namespace Subscribers
14 {
15 public partial class FormClient : Form,IPublisherCallback
16 {
17 PublisherClient proxy = null ;
18
19 public FormClient()
20 {
21 InitializeComponent();
22 InstanceContext instance = new InstanceContext( this );
23 proxy = new PublisherClient(instance);
24 }
25
26 private Guid id = Guid.NewGuid();
27
28 private void button1_Click( object sender, EventArgs e)
29 {
30 proxy.Subscriber(id);
31 }
32
33 public void Notify()
34 {
35 MessageBox.Show( string .Format( " SubScriber : Thread {0} " , Thread.CurrentThread.GetHashCode()));
36 }
37
38 private void button2_Click( object sender, EventArgs e)
39 {
40 proxy.UnSubscriber(id);
41 }
42
43 }
44 }
45
好了,一个简单的发布订阅实例就完成了.