合肥程序员群:49313181。    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入)
Q  Q:408365330     E-Mail:egojit@qq.com

WCF中双程操作。这里主要介绍心跳技术。

每当客户端给服务端发送消息时,服务端在接收到消息后,给客户端反馈一条消息(称为回调操作),而这个反馈消息不需要考虑客户端是否收到这个反馈消息。

本文介绍一个简单例子,例子展示如何实现服务端与客户端的交互。

一、服务端

首先写服务契约

.[ServiceContract(CallbackContract = typeof(IWCFServiceCallBack))]
.public interface IWCFService
.{
. //操作契约
. [OperationContract]
. string OprT(string name);
.}

注:

CallbackContract= typeof(IWCFServiceCallBack)表示服务端接收到客户端的消息时给客户的响应(即回调操作),IWCFServiceCallBack即为回调契约,定义如下:

.public interface IWCFServiceCallBack
.{
. //操作契约
. [OperationContract(IsOneWay = true)]
. void FeedBack(string info);
.}

注:

1.回调服务契约,由于回调方法在客户端执行,因此无须添加 ServiceContract特性。

2.对于成功后回调反馈操作,服务器无须获取其返回信息,因此添加 IsOneWay=true 特性。

接着,服务端实现契约:

.public class WCFService : IWCFService
.{
. //获取当前操作客户端对象实例
. IWCFServiceCallBack callback
. = OperationContext.Current.GetCallbackChannel<IWCFServiceCallBack>();
. //实现接口定义的方法(在服务端运行)
. public string OprT(string clientPCName)
. {
. Console.WriteLine("收到客户端的连接消息消息:{0} {1}", DateTime.Now, clientPCName);
. callback.FeedBack("进过分析后的用户名" + clientPCName.Split('-')[]);
. //这边可以返回任何客户端需要的信息//如果客户端不需要信息可以将此函数设为void返回类型
. return "客户端连接正常";
. }
.}

二、宿主,主要工作就是开启服务

配置文件如下:

01.<?xml version="1.0" encoding="utf-8" ?>
02.<configuration>
03. <system.serviceModel>
04. <services>
05. <service behaviorConfiguration="WCFService.WCFServiceBehavior"
06. name="Service0413.WCFService">
07. <endpoint
08. address="net.tcp://localhost:9000/WCFService"
09. binding="netTcpBinding"
10. contract="Service0413.IWCFService">
11. </endpoint>
12. <host>
13. <baseAddresses>
14. <!--这里的baseAddress是客户端服务引用的URI-->
15. <add baseAddress="http://localhost:9090/"/>
16. </baseAddresses>
17. </host>
18. </service>
19. </services>
20. <behaviors>
21. <serviceBehaviors>
22. <behavior name="WCFService.WCFServiceBehavior">
23. <!--为了可以通过URI引用服务,这里需设置httpGetEnabled为true-->
24. <serviceMetadata httpGetEnabled="true" />
25. <serviceDebug includeExceptionDetailInFaults="false" />
26. </behavior>
27. </serviceBehaviors>
28. </behaviors>
29. </system.serviceModel>
30.</configuration>

寄宿宿主:

01.//服务宿主就干一件事:打开服务
02.class Host
03.{
04. static void Main(string[] args)
05. {
06. //回调服务WCFServiceCallBack
07. ServiceHost host = new ServiceHost(typeof(Service0413.WCFService));
08. try
09. {
10. //判断是否以及打开连接,如果尚未打开,就打开侦听端口
11. if (host.State != CommunicationState.Opening)
12. host.Open();
13. //显示运行状态
14. Console.WriteLine("ServiceHost is runing! and state is {0}", host.State);
15. Console.Read();
16. }
17. catch (Exception ex)
18. {
19. Console.WriteLine(ex.ToString());
20. }
21. finally
22. {
23. host.Close();
24. }
25. }
26.}

三、客户端:

首先要实现回调的契约接口(通俗点将就是服务端接收到客户端消息后给客户端发聩信息,在客户端执行):

./// <summary>要实现回调的契约接口
./// </summary>
.public class WCFCallback : Service2012.IWCFServiceCallback
.{
. public void FeedBack(string info)
. {
. Console.WriteLine("服务器已经收到您的消息!消息内容:" + info);
. }
.}

最后是入口函数部分

.public class Client
. {
. //获得客户端的计算机名(实际可以扩展到获取客户端的一切想要的数据)
. private static string clientName = Environment.MachineName;
. private static Service2012.IWCFServiceCallback callBack = new WCFCallback();
. private static InstanceContext context = new InstanceContext(callBack);
. private static Service2012.WCFServiceClient WCFServiceCallBackClientProxy =
. new WCFServiceClient(context, "NetTcpBinding_IWCFService");
. static void Main(string[] args)
. {
. System.Timers.Timer timer = new System.Timers.Timer();
. //绑定定期自动执行的操作
. timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
. timer.Enabled = true;
. string s=Console.ReadLine();
. Console.WriteLine(s);
. }
. private static void OnTimedEvent(object source, ElapsedEventArgs e)
. {
. string operateInfo = WCFServiceCallBackClientProxy.OprT(clientName);
. Console.WriteLine(operateInfo);
. }
. }

至此完成,本例没有进行异常处理,请注意先运行服务端,再运行客户端。

WCF双向通信,心跳的更多相关文章

  1. WCF 项目应用连载[3] - 双向通信 实例管理与服务端监控

    WCF 项目应用连载[1] - 索引 - 轻量级的Log系统 - Lig Sample -序 第二节我们已经创建了Lig项目,并且能稳定工作了.现在我们来改进ILigAgent接口,实现WCF的双向通 ...

  2. WCF心跳判断服务端及客户端是否掉线并实现重连接

    WCF心跳判断服务端及客户端是否掉线并实现重连接 本篇文章将通过一个实例实现对WCF中针对服务端以及客户端是否掉线进行判断:若掉线时服务器或客户端又在线时将实现自动重连:将通过WCF的双工知识以及相应 ...

  3. WCF学习之旅—TCP双工模式(二十一)

    WCF学习之旅—请求与答复模式和单向模式(十九) WCF学习之旅—HTTP双工模式(二十) 五.TCP双工模式 上一篇文章中我们学习了HTTP的双工模式,我们今天就学习一下TCP的双工模式. 在一个基 ...

  4. 利用WCF的双工通讯实现一个简单的心跳监控系统

    何为心跳监控系统? 故名思义,就是监控某个或某些个程序的运行状态,就好比医院里面的心跳监视仪一样,能够随时显示病人的心跳情况. 心跳监控的目的是什么? 与医院里面的心跳监视仪目的类似,监控程序运行状态 ...

  5. WCF入门教程3——WCF通信模式

    本章内容 请求/响应模式 单工模式 双工模式 WCF异步调用 请求与响应模式 请求/响应     请求/响应通信是指客户端向服务端发送消息后,服务端会向客户端发送响应.这也意味着在接收到服务的响应以前 ...

  6. 用.NET MVC实现长轮询,与jQuery.AJAX即时双向通信

    两周前用长轮询做了一个Chat,并移植到了Azure,还写了篇博客http://www.cnblogs.com/indream/p/3187540.html,让大家帮忙测试. 首先感谢300位注册用户 ...

  7. [WCF编程]11.错误:错误契约

    一.错误传播 服务需要向客户端报告特定错误,当WCF默认的错误屏蔽方法并不包含这一实现.另一个重要的问题与传播到客户端有关,即由于异常是针对特定技术的,因此无法跨越服务边界而被共享.要实现无缝的互操作 ...

  8. [WCF编程]10.操作:回调操作

    一.回调操作概述 WCF支持服务将调用返回给它的客户端.在回调期间,许多方面都将颠倒过来:服务将成为客户端,客户端将编程服务.回调操作可以用在各种场景和应用程序中,但在涉及事件或者服务发生时间需要通知 ...

  9. WCF service 获取 client 端的 IP 和 port (转)

    转帖记录一下,以便日后使用. 主要使用是.NET3.5里的服务端上下文的消息实例的RemoteEndpointMessageProperty属性,获取客户端地址信息.但是限制 的绑定是HTTP.TCP ...

随机推荐

  1. ROW_NUMBER

    16:23 2015/4/16 删除重复数据,连续被两位同事问到完全相同的重复记录如何删除只保留一条 create table del_samerecords (id )) go insert int ...

  2. resin or tomcat .war e.g. note

    经常想在后台找WEB对应文件,做个记录 jar cvf step1.war . 命令将jsp(内含有html等数据局),等编译成war包目录下的文件有index.jps,eg.css -------- ...

  3. Java基础之在窗口中绘图——利用多态性使用鼠标自由绘图(Sketcher 7 with a crosshair cursor)

    控制台程序. 在Sketcher中创建形状时,并不知道应该以什么顺序创建不同类型的形状,这完全取决于使用Sketcher程序生成草图的人.因此需要绘制形状,对它们执行其他操作而不必知道图形是什么.当然 ...

  4. c++ socket编程步骤

    sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW):基于TCP的socket编程是采用的流式套接字. 服务器 ...

  5. 左 or 右

    背景: 掌握的知识:C++.MFC.设计模式.STL,熟悉windows网络编程,了解COM组件但是不精. 近期辞职找工作,发现windows下的C++开发职位很少.linux和移动端开发职位多,但是 ...

  6. easyui datagrid将表头的checkbox不显示(隐藏)

    <script type="text/javascript"> $(function(){ $("#dg").datagrid({ url:&quo ...

  7. VS2013 密钥

    MXS&Vincene  ─╄OvЁ  &0000017─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄OvЁ:今天很残酷,明天更残酷,后天很美好, ...

  8. 20145227&20145201 《信息安全系统设计基础》实验一 开发环境的熟悉

    北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级:1452 姓名:李子璇 鄢曼君 学号:20145201 20145227 成绩: 指导教师:娄嘉鹏 实验日期:2016 ...

  9. Digital Roots 1013

    Digital Roots 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte总提交:456            测试通过:162 描述 T ...

  10. js 获得日期相差天数

    function getDays(strDateStart,strDateEnd){               var strSeparator = "-"; //日期分隔符   ...