WCF-双工通讯

news/2025/9/23 10:01:47/文章来源:https://www.cnblogs.com/sundh1981/p/19106646

WCF双工通讯只要是通过调用由客户端实现的接口ICallback, 来实现服务端调用该接口方法来实现回调,从而把相关数据或对象传递到客户端的一种实现方式。当然目前通过WebSocket 也可以很容易实现,这里暂不讨论其他方法,只对WCF方法做一个简单的记录,以备忘记。


  • 服务端

服务端接口(契约)

using System.ServiceModel;[ServiceContract(CallbackContract =typeof(IClientCallback))]public interface IMyService{[OperationContract(IsOneWay = true)]void RegisterClient();[OperationContract]void SendMessage(string message);}

回调接口(该接口在服务端不实现,由客户端实现)

 [ServiceContract]public interface IClientCallback{[OperationContract(IsOneWay = true)]void NotifyClient(string message);[OperationContract(IsOneWay = true)]void ServerTimeUpdate(DateTime time);}

服务端实现接口类(即提供相关服务)

  //服务实现[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]public class MyService : IMyService{private IClientCallback callback;private Timer timer;public MyService() { //获取客户端回调通道callback=OperationContext.Current.GetCallbackChannel<IClientCallback>();}public void RegisterClient(){Console.WriteLine("客户端已连接");//设置定时器,定期向客户端发送服务器时间timer = new Timer(1000);timer.Elapsed += (s, e) => {try{callback.ServerTimeUpdate(DateTime.Now);} catch(Exception ex) {Console.WriteLine(ex.ToString());}};timer.Start();}public void SendMessage(string message){Console.WriteLine($"收到客户端消息:{message}");//向客户端发送响应callback.ServerTimeUpdate(DateTime.Now);}}

服务端启动WCF方法

  internal class Program{static void Main(string[] args){using (ServiceHost host = new ServiceHost(typeof(MyService))){try {host.Open();Console.WriteLine("双工服务已启动!");foreach (var ep in host.Description.Endpoints){Console.WriteLine(ep.ListenUri);}}catch(Exception ex)  {Console.WriteLine(ex.Message);}Console.ReadKey();}}}

服务端配置文件

<system.serviceModel><services><service name="DuplexService.Services.MyService"><endpoint address="" binding="wsDualHttpBinding" contract="DuplexService.Services.IMyService" /><endpoint address="" binding ="netTcpBinding" contract="DuplexService.Services.IMyService" /><host><baseAddresses><add baseAddress="http://localhost:10020/MyService"/><add baseAddress="net.tcp://localhost:10021/MyService" /></baseAddresses></host></service></services><behaviors><serviceBehaviors><behavior><serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/></behavior></serviceBehaviors></behaviors>
</system.serviceModel>

客户端

客户端对回调接口的实现

 public class ClientCallback : IMyServiceCallback{/// <summary>/// 服务端通过回调接口来对客户端实例方法进行回调,给客户端传递消息/// </summary>/// <param name="message"></param>/// <exception cref="NotImplementedException"></exception>public void NotifyClient(string message){Console.WriteLine($"收到服务端发送的消息:{message}");}/// <summary>/// 服务端通过回调接口来对客户端实例方法进行回调,给客户端传递时间/// </summary>/// <param name="time"></param>/// <exception cref="NotImplementedException"></exception>public void ServerTimeUpdate(DateTime time){Console.WriteLine($"收到服务端回发的更新时间:{time.ToString("YYYY-MM-dd hh:mm:ss")}");}}

客户端实现双通道调用

 internal class Program{static void Main(string[] args){//创建回调实例和实例上下文ClientCallback callback= new ClientCallback();InstanceContext context = new InstanceContext(callback);//创建双通道工厂(提供创建和管理不同类型的双工通道的方式,客户端使用这些通道在服务终结点发送和接收消息)DuplexChannelFactory<IMyService> fact = new DuplexChannelFactory<IMyService>(context,new NetTcpBinding(),new EndpointAddress("net.tcp://localhost:10021/MyService"));//创建到指定终结点指定类型的通道IMyService channel = fact.CreateChannel();try {//注册客户端channel.RegisterClient();Console.WriteLine("已连接到服务器,输入消息发送给服务器");string input;while ((input = Console.ReadLine()) != "exit"){channel.SendMessage(input);}channel.SendMessage("客户端退出");}catch (Exception ex){Console.WriteLine($"发生错误:{ex.Message}");//使通讯对象从其当前状态转换到关闭状态channel.Stop();fact.Close();}}}

客户端配置文件

 <system.serviceModel><bindings><netTcpBinding><binding name="NetTcpBinding_IMyService"><security><transport sslProtocols="None" /></security></binding></netTcpBinding><wsDualHttpBinding><binding name="WSDualHttpBinding_IMyService" /></wsDualHttpBinding></bindings><client><endpoint address="http://localhost:10020/MyService" binding="wsDualHttpBinding"bindingConfiguration="WSDualHttpBinding_IMyService" contract="ServiceReference1.IMyService"name="WSDualHttpBinding_IMyService"><identity><userPrincipalName value="DESKTOP-H27UFUR\Administrator" /></identity></endpoint><endpoint address="net.tcp://localhost:10021/MyService" binding="netTcpBinding"bindingConfiguration="NetTcpBinding_IMyService" contract="ServiceReference1.IMyService"name="NetTcpBinding_IMyService"><identity><userPrincipalName value="DESKTOP-H27UFUR\Administrator" /></identity></endpoint></client></system.serviceModel>

效果

  • 服务端
    image

  • 客户端
    image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/912142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四川省城乡和住房建设厅网站聊城开发网站建设

python内置函数 D Python 解释器内置了很多函数和类型&#xff0c;任何时候都能使用。 D 名称描述delattr删除对象的属性。dict创建字典对象。dir列出对象的属性。divmod同时执行除法运算和取模运算&#xff0c;返回一个包含商和余数的元组。 delattr(object, name) delat…

Create lv of type vdo on RHEL8 9

Create lv of type vdo on RHEL8 HDD: 700G vg: 700G lv: 650G vdo: 7000G yum install lvm2 kmod-kvdo vdo -y fdisk /dev/sdc vgcreate vg_vdo /dev/sdc1lvcreate --type vdo -n vdo_virtual -L 650G -V 7000G vg_…

如何做好研发项目的资源分配

如何做好研发项目的资源分配研发项目与人力资源关系 最近,共创力咨询在一些研发项目管理咨询过程中,发现了客户存在一些共性的问题: 1)项目需求无法收敛,导致原来计划的人力资源不足; 2)项目多,人手少,所有的…

Notepad++ 最新破解版下载及安装使用教程

Notepad++ 最新破解版下载及安装使用教程一、Notepad++V软件介绍Notepad++V 是 Windows 系统下免费开源的轻量级文本编辑器,核心优势如下: 多语言兼容:支持 80+ 编程语言(Python/Java/C++/HTML/CSS/JavaScript/SQL…

网站建设研究方法用vs做购物网站

题目描述 对应给定的一个序列可以唯一确定一棵二叉排序树。然而&#xff0c;一棵给定的二叉排序树却可以由多种不同的序列得到。例如分别按照序列{3,1,4}和{3,4,1}插入初始为空的二叉排序树&#xff0c;都得到一样的结果。你的任务书对于输入的各种序列&#xff0c;判断它们是否…

申请个人手机网站空间re安装wordpress

前言 这是《从0开发一个Chrome插件》系列的第十一篇文章,本系列教你如何从0去开发一个Chrome插件,每篇文章都会好好打磨,写清楚我在开发过程遇到的问题,还有开发经验和技巧。 专栏: 从0开发一个Chrome插件:什么是Chrome插件?从0开发一个Chrome插件:开发Chrome插件的必…

网站图片如何做缓存wordpress nginx php.ini

如何解锁EXCEL表格编辑保护和VBA隐藏代码保护&#xff1f;当我们想借用别人的表格发现表格上锁无法编辑又不知道密码时或者当我们用软件生成一些表格时往往会遇到“上锁”问题&#xff0c;导致我们无法对表格进行改动。类似下图这样&#xff1a;那怎么才能征服她呢&#xff1f;…

幼儿教育网站源码网站建设300

火车头采集网页数据发布到织梦CMS&#xff08;DeDeCMS&#xff09;系统操作步骤如下&#xff1a; 1. 火车头采集织梦DeDeCMS发布模块下载安装 百度网盘&#xff1a;火车头采集织梦CMS发布插件下载地址 提取码&#xff1a;414h 2. 在火车头采集软件导入织梦De…

平坝网站建设网站美工设计收费

栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;是计算机科学中常见的线性数据结构&#xff0c;它们在许多算法和编程场景中发挥着重要作用。它们的不同特点和用途使得它们适用于不同的问题和应用。 栈&#xff08;Stack&#xff09; 栈&#xff0c;作为…

南通网站的优化苏州关键词搜索排名

问题截图&#xff1a; 由于作者使用递归统计信息&#xff0c;刚开始这个接口运行得正常&#xff0c;但是上线运行一段时间后接口就出现了&#xff0c;如图的栈溢出错误。可以看出确实是堆栈溢出了&#xff0c;解决栈溢出目前只有两种方式&#xff1a; 第一种调大栈的大小&…

西安企业网站seo网页游戏排行榜 511

网址&#xff1a;https://github.com/NLP-LOVE/ML-NLP 此项目是机器学习(Machine Learning)、深度学习(Deep Learning)、NLP面试中常考到的知识点和代码实现&#xff0c;也是作为一个算法工程师必会的理论基础知识。 http://mantchs.com/ 此项目是机器学习、NLP面试中常考到的…

跨网文件安全交换系统:打破数据壁垒的高效之选!

在数字化时代,政府部门、金融、能源等行业及大中型企业为保护核心数据,普遍采用多网络隔离架构,不同网络拥有不同密级和权限。这种隔离虽保障了数据安全,却形成了 “数据孤岛”,跨网数据交换需求日益迫切,跨网文…

【F#学习】可区分联合 Discriminated Unions

可区分联合是一串固定的项目。使用type和| 来声明。将每一个项目称为一个case。 type Season =| Spring // Spring 就是一个 case| Summer| Autumn| Winter可区分联合的每一个case都可以附加一些数据,不同的case可以…

Midscene.js - 开源的 AI 操作助手 - 广东靓仔

开源的 AI 操作助手,适用于 Web、移动端、自动化和测试功能特性使用 Javascript SDK 或 YAML 格式编写自动化脚本。 网页或移动应用 用于调试的可视化报告:通过我们的测试报告和 Playground,可以轻松理解、回放和调…

详细介绍:【Datawhale25年9月组队学习:llm-preview+Task1:大模型介绍与环境配置】

详细介绍:【Datawhale25年9月组队学习:llm-preview+Task1:大模型介绍与环境配置】pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; f…

企业网站的建立与维护论文网站的定位

文章目录 什么是Sa-Token?为什么集成Redis的redisson客户端?如何集成?maven依赖application.yml配置过滤器配置验证参考什么是Sa-Token? Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权…

网站建设 样板wordpress远程安装教程

关于 jar 的查找&#xff0c;及使用版本的确定&#xff0c;及依赖的版本确认&#xff0c;避免 jar 冲突或版本不兼容 在使用 maven 构建项目时&#xff0c;需要的 jar 可以通过在 https://mvnrepository.com/ 可以找到部分需要的依赖&#xff0c;这里以查找 mybatis 依赖为例&…

网站系统中备案申请表高清直播

在互联网业务中&#xff0c;CDN的应用已经成了普遍&#xff0c;SRE的日常需求中&#xff0c;CDN的刷新在前端需求逐渐中占了很大比例&#xff0c;并且比较琐碎。做为合格的SRE&#xff0c;把一切自动化是终极使命&#xff0c;而今天就分享通过JenkinsTerraform实现阿里云的CDN自…

全flash网站下载网站建设竞价托管服务

1、引言 在这个信息爆炸的时代&#xff0c;无论是军事爱好者、科研工作者&#xff0c;还是户外探险者&#xff0c;他们都需要快速准确地获取特定装备的信息。装备名称检索推荐系统正是为了应对这一挑战而生。它像一位经验丰富的向导&#xff0c;引领用户穿越复杂的装备海洋&am…