一直以为感觉双工没弄懂,着实觉得很惆怅,在网上了解下双工的一些特点,直接上代码,以便以后项目中用的着:

service层:

定义一个IDuplexHello服务接口
[ServiceContract(
Name = "DuplexHello",
Namespace = "http://microsoft.wcf.documentation",
CallbackContract = typeof(IHelloCallbackContract), //设置回调服务类型
SessionMode = SessionMode.Required
)]
public interface IDuplexHello
{
[OperationContract]
void Hello(string greeting);
}
实现DuplexHello.cs

public class DuplexHello : IDuplexHello
{
public void Hello(string greeting)
{
Console.WriteLine("Caller sent: " + greeting);
Console.WriteLine("Session ID: " + OperationContext.Current.SessionId);
Console.WriteLine("Waiting two seconds before returning call.");
Thread.Sleep(2000);
var callerProxy
= OperationContext.Current.GetCallbackChannel<IHelloCallbackContract>();
var response = "Service object " + this.GetHashCode().ToString() + " received: " + greeting;
Console.WriteLine("Sending back: " + response);
callerProxy.Reply(response);
}
}
 定义回调接口(回调服务函数没有必要添加servicecontract,因为人家是包含在IDuplexHello服务类型中的)
public interface IHelloCallbackContract
{
[OperationContract(IsOneWay = true)] //一定要记得添加operationcontract
void Reply(string responseToGreeting);
}
这里的回调接口实现类(HelloCallbackContract.cs)我是直接在service层实现的,当然在项目里面肯能大多数情况下都是在客服端实现,我这里也就为了方便啦
public class HelloCallbackContract : IHelloCallbackContract
{
public void Reply(string responseToGreeting)
{
Console.WriteLine(responseToGreeting);
}
}

将service寄宿到控制台应用程序中(用的都是代码实现):

private static void Main(string[] args)
{
using (var host = new ServiceHost(typeof (DuplexHello),
new Uri("http://localhost:991/DuplexHello"))) //添加基地址,在client就是这个地址,另外端口号不能鱼双工端口号相同
{
host.AddServiceEndpoint(typeof (IDuplexHello),
new NetTcpBinding(),
"net.tcp://localhost:999/DuplexHello");
var metadatbehavior =
host.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (metadatbehavior == null)
{
metadatbehavior = new ServiceMetadataBehavior()
{
HttpGetEnabled = true
};
host.Description.Behaviors.Add(metadatbehavior);
}
host.Opened += delegate
{
Console.WriteLine("服务已经启动");
};
host.Open();
Console.Read();
}

client层使用的也是一个控制台应用程序:

首先要运行宿主(找到host层资源文件夹bin->debug  :host.exe)在更新wcf服务的时候也必须要先运行host.exe,否则会出现无法连接到服务器错误,

然后添加服务引用中地址栏输入http://localhost:991/DuplexHello 应用服务

再后应用之后客户端app.config自动生成如下代码:

<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_DuplexHello" />
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://localhost:999/DuplexHello"
binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_DuplexHello"
contract="ServiceReference1.DuplexHello"
name="NetTcpBinding_DuplexHello">
<identity>
<userPrincipalName value="objectboy-PC\objectboy" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>

客服端控制台应用程序中代码:

private static void Main(string[] args)
{
var hellocallbackcontract =
new HelloCallbackContract();
var instanceContext =
new InstanceContext(hellocallbackcontract); //实例化客服端类服务上下文
var duplexChannelFactory =
new DuplexChannelFactory<IDuplexHello>(instanceContext,
new NetTcpBinding()); //实例化双工通道,并绑定为tcp通信,注意不能用ChannelFactory,因为这是双工
var endpointaddress =
new EndpointAddress("net.tcp://localhost:999/DuplexHello");
var proxy =
duplexChannelFactory.CreateChannel(endpointaddress); //创建并将消息发送到指定的消息通道
using (proxy as IDisposable)
{
proxy.Hello("cccccccccccccccccc");
}
Console.Read();
}

客服端输出:

服务端输出:

wcf双工通信的更多相关文章

  1. Wcf 双工通信的应用

    概述 双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工ME ...

  2. WCF 双工通信

    注释:本学习是参考Artech大神的资料: 在WCF 实现双工通信 在这里我就不介绍双工通信的概念了,我写博客的目的是检测自己掌握情况,看我wcf通信后,觉得纸上得来终觉浅,绝知此事要躬行. 我使用的 ...

  3. WCF双工通信笔记

    1,Dupex(双工) MEP(消息交换模式),服务端回调(Callback)客户端操作 2,客户端调用服务时,附加上一个回调对象(InstanceContext).服务端处理服务请求时,通过该回调对 ...

  4. WCF双工通信单工通信

    1.单工模式 单向通信,指通信只有一个方向进行,即从客户端流向服务,服务不会发送响应,而客户端也不会期望会有响应.这种情况下,客户端发送消息,然后继续执行 运行后报错: 2.双工模式 双工模式的特点是 ...

  5. [转载]WCF实现双工通信

    双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工MEP又具 ...

  6. 我的WCF之旅(3):在WCF中实现双工通信

    双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工MEP又具 ...

  7. 在WCF中实现双工通信

    双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工MEP又具 ...

  8. 利用WCF双工模式实现即时通讯

    概述 WCF陆陆续续也用过多次,但每次都是浅尝辄止,以将够解决问题为王道,这几天稍闲,特寻了些资料看,昨晚尝试使用WCF的双工模式实现了一个简单的即时通讯程序,通过服务端转发实现客户端之间的通讯.这只 ...

  9. [SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端

    原文:[SignalR]SignalR与WCF双工模式结合实现服务端数据直推浏览器端 之前开发基于WinForm监控的软件,服务端基于Wcf实现,里面涉及双工模式,在客户端里面,采用心跳包机制保持与服 ...

随机推荐

  1. Android Weekly Notes Issue #321

    Android Weekly Issue #321 August 5th, 2018. Android Weekly Issue #321 本期内容包括: 开源项目Plaid的改版; 使用Tensor ...

  2. Java常用类Date、Calendar、SimpleDateFormat详解

    Date类 java.util 包提供了 Date 类来封装当前的日期和时间,Date 类提供两个构造函数来实例化 Date 对象 第一个构造函数使用当前日期和时间来初始化对象   Date( ) 第 ...

  3. 改变Ecplise项目窗口字体样式

    Eclipse\plugins\org.eclipse.ui.themes_1.1.1.v20151026-1355\css e4-dark_win.css CTabFolder Tree, CTab ...

  4. Jmeter-JDBC Request

    1.  新建一个测试计划 2.  新建一个线程组 3.  创建数据库连接 4.配置数据库连接 5.添加JDBC Request 6.添加监听器

  5. 点分治Day2 动态树分治

    蒟蒻Ez3real冬令营爆炸之后滚回来更新blog... 我们看一道题 bzoj3924 ZJOI2015D1T1 幻想乡战略游戏 给一棵$n$个点的树$(n \leqslant 150000)$ 点 ...

  6. ACM学习历程—HDU5410 CRB and His Birthday(动态规划)

    Problem Description Today is CRB's birthday. His mom decided to buy many presents for her lovely son ...

  7. ACM学习历程——POJ3321 Apple Tree(搜索,线段树)

          Description There is an apple tree outside of kaka's house. Every autumn, a lot of apples will ...

  8. 【LeetCode】064. Minimum Path Sum

    题目: Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right w ...

  9. RabbitMQ的持久化机制

    一.问题的引出 RabbitMQ的一大特色是消息的可靠性,那么它是如何保证消息可靠性的呢?——消息持久化.为了保证RabbitMQ在退出,服务重启或者crash等异常情况下,也不会丢失消息,我们可以将 ...

  10. bzoj 3376 [Usaco2004 Open]Cube Stacking 方块游戏——带偏移量的并查集

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3376 带偏移量的并查集. #include<iostream> #include ...