合肥程序员群: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. tableView和scrollView滚动起冲突

    tableView和scrollView滚动起冲突 tableView也是继承的scrollView,所以在滚动的时候也会触发scrollView的代理方法,在scrollViewDidScroll中 ...

  2. Python之路-python(面向对象进阶(模块的动态导入、断言、Socket Server))

    模块的动态导入 断言 Socket Server 一.模块的动态导入 class C(object): def __init__(self): self.name = "zhangsan&q ...

  3. git制作增量包用于更新代码

    1 先找到指定的开始提交id,比如 05104e3475f63e1e49fbfcbd424a4a3801b95645 2 找到结束的提交id,比如 a0eb9bc6d4e1801062877fd435 ...

  4. struts2实现文件上传、多文件上传和文件下载

    总结的两个问题,就是struts2上传下载的时候对属性名配置要求非常严格: 第一:上传的时候 private File file; private String fileContentType; pr ...

  5. HtmlHelper的扩展

    HtmlHelper的扩展: 注意点:扩展方法必须是静态方法,所在的类必须是静态类,所在的命名空间改成System.Web.MVC则能省略页面中必须添加命名空间的约束. //主要就是输出分页的超级链接 ...

  6. :enabled 匹配所有可用元素

    描述: 查找所有可用的input元素 HTML 代码: <form> <input name="email" disabled="disabled&qu ...

  7. php中curl模拟浏览器来传输数据

    cURL可以使用URL的语法模拟浏览器来传输数据, 因为它是模拟浏览器,因此它同样支持多种协议,FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以 ...

  8. 161213、Maven资源替换和Freemarker模板

    先介绍一下本文的两位主角: Apache Maven - 正当红的项目管理工具 FreeMarker - 老牌的模板引擎 两者貌似互不相干,何来冲突呢? 原来Maven有一个内置的资源替换机制, 可以 ...

  9. mysql常用命令(1)

    Mysql安装目录数据库目录/var/lib/mysql/配置文件/usr/share/mysql(mysql.server命令及配置文件)相关命令/usr/bin(mysqladmin mysqld ...

  10. 怎样使用 GitHub?

    作者:珊姗是个小太阳链接:https://www.zhihu.com/question/20070065/answer/79557687来源:知乎著作权归作者所有,转载请联系作者获得授权. 作为一个文 ...