WCF 双向通讯实例-简易的聊天程序
程序分四个部分:
1、原理
使用WCF的nettcp绑定。nettcp绑定类似原来的RPC,即.net remoting,只是在WCF提供统一协定,同一服务可以拥有多种客户端。
2、代码展示
代码部分分为契约、服务、服务端UI、客户端四个部分。
2.1、契约部分
定义服务的接口,一个提供服务,另一个提供回调。
服务端接口定义:
[ServiceContract(
Name = "SampleDuplexHello",
Namespace = "http://microsoft.wcf.documentation",
CallbackContract = typeof(IHelloCallbackContract),
SessionMode = SessionMode.Required
)]
public interface IDuplexHello
{
/// <summary>
/// 往服务端发送消息
/// </summary>
/// <param name="greeting"></param>
[OperationContract(IsOneWay = true)]
void Hello(string greeting); /// <summary>
/// 让服务端缓存客户端
/// </summary>
[OperationContract]
void Registor();
}
服务端回调接口定义:
/// <summary>
/// 回调接口
/// </summary>
public interface IHelloCallbackContract
{
/// <summary>
/// 向客户端推送消息
/// </summary>
/// <param name="responseToGreeting"></param>
[OperationContract(IsOneWay = true)]
void Reply(string responseToGreeting);
}
2.2、服务实现部分
代码部分:
public class DuplexHelloImpl : IDuplexHello, IBrocaster
{
private ConcurrentBag<IHelloCallbackContract> clients = new ConcurrentBag<IHelloCallbackContract>(); 。。。 public void Hello(string greeting)
{
if (ServerInstance != null)
{
ServerInstance.Update(greeting);
}
} public void Registor()
{
IHelloCallbackContract callerProxy
= OperationContext.Current.GetCallbackChannel<IHelloCallbackContract>();
if (!clients.Contains(callerProxy))
{
clients.Add(callerProxy);
}
}
}
配置部分:
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NewBinding0">
<security mode="None"/>
</binding>
</netTcpBinding>
</bindings>
<services> <service name="WindowsFormsServer.DuplexHelloImpl">
<endpoint address="net.tcp://localhost:909/hello" bindingConfiguration="NewBinding0" binding="netTcpBinding" contract="Contracts.IDuplexHello"/> </service>
</services>
</system.serviceModel>
启动部分:
static void Main()
{
ServiceHost host = new ServiceHost(typeof(DuplexHelloImpl));
host.Open(); 。。。
}
2.3、服务端界面
public partial class ServerForm : Form, IUpdater
{
public static IBrocaster ServiceInstance { get; set; } public ServerForm()
{
InitializeComponent();
} public void Update(string content)
{
this.Invoke(new Action(() =>
{
this.textBox2.AppendText(content);
this.textBox2.AppendText("\r\n");
}));
} private void button1_Click(object sender, EventArgs e)
{
if (!string.IsNullOrWhiteSpace(textBox1.Text))
{
if (ServiceInstance == null)
{
MessageBox.Show("服务启动中,稍后再发!");
return;
}
ServiceInstance.Brocast(textBox1.Text);
textBox1.Text = "";
}
else
MessageBox.Show("回复内容不能为空!");
} private void ServerForm_Load(object sender, EventArgs e)
{
//Service与主窗体非同步,因而需要等待
Task.Run(() => {
while (ServiceInstance == null)
{
Thread.Sleep();
}
ServiceInstance.ServerInstance = this;
});
}
}
2.4、客户端界面
public partial class ClientForm : Form, IHelloCallbackContract
{
/// <summary>
/// 定义为字段,以供重用。
/// </summary>
IDuplexHello client;
public ClientForm()
{
InitializeComponent();
} public void Reply(string responseToGreeting)
{
this.textBox2.AppendText(responseToGreeting);
this.textBox2.AppendText("\r\n");
} private void button1_Click(object sender, EventArgs e)
{
if (!string.IsNullOrWhiteSpace(textBox1.Text))
{
client.Hello(textBox1.Text);
textBox1.Text = "";
}
else
MessageBox.Show("回复内容不能为空!"); } private void ClientForm_Load(object sender, EventArgs e)
{
//创建连接
InstanceContext cxt = new InstanceContext(this);
NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.None;
string url = "net.tcp://localhost:909/hello";
DuplexChannelFactory<IDuplexHello> factory =
new DuplexChannelFactory<IDuplexHello>(cxt, binding, url); client = factory.CreateChannel();
client.Registor();
}
}
WCF 双向通讯实例-简易的聊天程序的更多相关文章
- silverlight与wcf双向通讯 例子
本文将建立一个silverlight与wcf双向通讯的简单实例,以下是详细步骤: 新建Silverlight应用程序,名称WCFtest.解决方案中添加WCF服务应用程序,名称WcfServiceTe ...
- 基于UDP协议的控制台聊天程序(c++版)
本博客由Rcchio原创,转载请告知作者 ------------------------------------------------------------------------------- ...
- C# 异步通信 网络聊天程序开发 局域网聊天室开发
Prepare 本文将使用一个NuGet公开的组件技术来实现一个局域网聊天程序,利用组件提供的高性能异步网络机制实现,免去了手动编写底层的困扰,易于二次开发,扩展自己的功能. 在Visual Stud ...
- 重温WCF之数单向通讯、双向通讯、回调操作(五)
一.单向通讯单向操作不等同于异步操作,单向操作只是在发出调用的瞬间阻塞客户端,但如果发出多个单向调用,WCF会将请求调用放入到服务器端的队列中,并在某个时间进行执行.队列的存储个数有限,一旦发出的调用 ...
- boost asio异步读写网络聊天程序client 实例具体解释
boost官方文档中聊天程序实例解说 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...
- boost asio异步读写网络聊天程序客户端 实例详解
boost官方文档中聊天程序实例讲解 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...
- 我们一起学习WCF 第四篇单通讯和双向通讯
前言:由于个人原因很久没有更新这个系列了,我会继续的更新这系列的文章.这一章是单向和双向通讯.所谓的单向就是只有发送却没有回复,双向是既有发送还有回复.就是有来无往代表单向,礼尚往来表示双向.下面我用 ...
- 编写Java程序,应用客户端和服务端通过 Eclipse 控制台的输入和显示实现简易的聊天功能
查看本章节 查看作业目录 需求说明: 应用客户端和服务端通过 Eclipse 控制台的输入和显示实现简易的聊天功能 实现思路: 创建 Java 项目,在项目中创建服务端类 ChatServerThre ...
- 三十、【C#.Net开发框架】WCFHosting服务主机的利用WCF服务通讯和实现思路
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...
随机推荐
- mysql Backup &recovery
备份数据库非常重要,这样您就可以恢复数据,并在发生问题时重新启动并运行,例如系统崩溃,硬件故障或用户错误地删除数据. 在升级MySQL安装之前,备份也是必不可少的保护措施,它们可用于将MySQL安装转 ...
- csharp: Converting chinese character to Unicode
Function chinese2unicode(Str) Dim Str_one:Str_one = "" Dim Str_unicode:Str_unicode = " ...
- 第1章:程序设计和C语言(C语言入门)
一.程序和程序语言 1,程序的概念:完成某项事物所预设的活动方式. 2,程序设计:人们描述计算机要做的工作. 二 .程序设计语言及其发展 1.机器语言,2汇编语言,3高级语言{a)编译,b)解释}: ...
- python----openpyxl模块
openpyxl 模块 1.openpyxl的写 from openpyxl import Workbook wb = Workbook() # 方式一: 默认创建sheet在最后 wb1 = wb. ...
- chrome 控制台里 打印对象
我们经常使用 chrome 的 控制台 console.log() 打印 但有时候我们需要把一个对象复制下来(而这个对象嵌套比较深) 打印出来的我们不好复制 如下图 我们可以使用谷歌控制台的c ...
- Java设计模式—观察者模式
观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe). 其定义如下: 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都 ...
- OpenLayers中的图层(转载)
作者:田念明出处:http://www.cnblogs.com/nianming/本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法 ...
- ArcSDE10.2.2使用SQL操作ST_Geometry时报ORA-28579或ORA-20006错误
ArcSDE10.2.2使用SQL操作ST_Geometry时报ORA-28579或ORA-20006错误 1.测试环境说明 ArcSDE版本:10.2.2 Oracle版本:12.1.0.1和11. ...
- Thinkphp中在本地测试很好,在服务器上出错,有可能是因为debug缓存的问题
define('APP_DEBUG',false); 这个设置从true改为false后,一定要清空缓存,否则会出错.
- pt-duplicate-key-checker使用
pt-duplicate-key-checker工具可以检测表中重复的索引,对于一些业务量很大的表,而且开发不规范的情况下有用.基本用法: 看一下我们的测试表: mysql> desc new_ ...