• WCF双向通信,心跳


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


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

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

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

    一、服务端

            首先写服务契约

    01.[ServiceContract(CallbackContract = typeof(IWCFServiceCallBack))]  
    02.public interface IWCFService  
    03.{  
    04.    //操作契约   
    05.    [OperationContract]  
    06.    string OprT(string name);  
    07.}  

    注:

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

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

     注:

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

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

           接着,服务端实现契约:

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

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

            配置文件如下:

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

    三、客户端:

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

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

     最后是入口函数部分

    01.public class Client  
    02. {  
    03.     //获得客户端的计算机名(实际可以扩展到获取客户端的一切想要的数据)   
    04.      private static string clientName = Environment.MachineName;  
    05.     private static Service2012.IWCFServiceCallback callBack = new WCFCallback();  
    06.     private static InstanceContext context = new InstanceContext(callBack);  
    07.     private static Service2012.WCFServiceClient WCFServiceCallBackClientProxy =  
    08.                    new WCFServiceClient(context, "NetTcpBinding_IWCFService");  
    09.     static void Main(string[] args)  
    10.     {  
    11.         System.Timers.Timer timer = new System.Timers.Timer(2000);  
    12.         //绑定定期自动执行的操作   
    13.           timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);  
    14.         timer.Enabled = true;  
    15.         string s=Console.ReadLine();  
    16.         Console.WriteLine(s);  
    17.     }  
    18.     private static void OnTimedEvent(object source, ElapsedEventArgs e)  
    19.     {  
    20.         string operateInfo = WCFServiceCallBackClientProxy.OprT(clientName);  
    21.         Console.WriteLine(operateInfo);  
    22.     }  
    23. }  

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

  • 相关阅读:
    em和rem
    uniapp小程序 插槽 使用 template 失效!
    大半夜睡不着,来个雪花动画
    opencv 修改像素为透明色
    C++ unsigned char 和 char 的转换示例(数组没试)
    切割矩形,C++版
    清除blob生成图片的缓存
    C++ 固定长度的队列
    Chrome神器Vimium快捷键学习记录
    ASC简介
  • 原文地址:https://www.cnblogs.com/egojit/p/3284694.html
Copyright © 2020-2023  润新知