源码下载

程序分四个部分:

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 双向通讯实例-简易的聊天程序的更多相关文章

  1. silverlight与wcf双向通讯 例子

    本文将建立一个silverlight与wcf双向通讯的简单实例,以下是详细步骤: 新建Silverlight应用程序,名称WCFtest.解决方案中添加WCF服务应用程序,名称WcfServiceTe ...

  2. 基于UDP协议的控制台聊天程序(c++版)

    本博客由Rcchio原创,转载请告知作者 ------------------------------------------------------------------------------- ...

  3. C# 异步通信 网络聊天程序开发 局域网聊天室开发

    Prepare 本文将使用一个NuGet公开的组件技术来实现一个局域网聊天程序,利用组件提供的高性能异步网络机制实现,免去了手动编写底层的困扰,易于二次开发,扩展自己的功能. 在Visual Stud ...

  4. 重温WCF之数单向通讯、双向通讯、回调操作(五)

    一.单向通讯单向操作不等同于异步操作,单向操作只是在发出调用的瞬间阻塞客户端,但如果发出多个单向调用,WCF会将请求调用放入到服务器端的队列中,并在某个时间进行执行.队列的存储个数有限,一旦发出的调用 ...

  5. boost asio异步读写网络聊天程序client 实例具体解释

    boost官方文档中聊天程序实例解说 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...

  6. boost asio异步读写网络聊天程序客户端 实例详解

    boost官方文档中聊天程序实例讲解 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...

  7. 我们一起学习WCF 第四篇单通讯和双向通讯

    前言:由于个人原因很久没有更新这个系列了,我会继续的更新这系列的文章.这一章是单向和双向通讯.所谓的单向就是只有发送却没有回复,双向是既有发送还有回复.就是有来无往代表单向,礼尚往来表示双向.下面我用 ...

  8. 编写Java程序,应用客户端和服务端通过 Eclipse 控制台的输入和显示实现简易的聊天功能

    查看本章节 查看作业目录 需求说明: 应用客户端和服务端通过 Eclipse 控制台的输入和显示实现简易的聊天功能 实现思路: 创建 Java 项目,在项目中创建服务端类 ChatServerThre ...

  9. 三十、【C#.Net开发框架】WCFHosting服务主机的利用WCF服务通讯和实现思路

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://p ...

随机推荐

  1. 设置固定ip后无法上公网

    把电脑ip设置成固定ip后,发现其不能上公网,突然想到要设置DNS. 运行cmd程序,输入命令ipconfig /all查看此网络的DNS,设置固定ip 时添加此DNS地址即可.

  2. Java API 之 正则表达式

    一.基本概念 在项目中我们经常性做的一件事是“匹配”字符串 比如: 1.我们要验证用户输入的手机号是否合法? 2.验证设置的密码是否符合规则? 3.或者替换指定字符串中的一些内容. 这么一看,似乎正则 ...

  3. Class.forName之坑

    今天遇到个问题 找不到类,最后发现 Class.forName中要完整的类名

  4. 如何正确实现 IDisposable 接口

    MSDN建议按照下面的模式实现IDisposable接口: public class Foo: IDisposable { public void Dispose() { Dispose(true); ...

  5. js中random的应用

    1.生成一个随机数 var r = Math.random(); console.info(r); 结果生成一个0-1的随机数(返回0和1之间的伪随机数,可能为0,但总是小于1,[0,1)) 2.生成 ...

  6. flask 服务器详解

    #!/usr/local/bin/python # coding=utf-8 from flask import Flask app = Flask(__name__) @app.route('/') ...

  7. Centos 7 系统安装(简单步骤)

    前面步骤忽略.进入安装步骤. 运行安装 到选择语言的时候最好选英文版,这里做模板,用的中文版 接着下一步到安装选项 在日期和时间里,选择上海时区 紧接着进行软件安装选择,如图安装就好 接着进行分区,也 ...

  8. 软件项目技术点(9)——如何将gif动态图拆分绘制

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 背景介绍 我们的软件支持插入gif图片,并且展示在软件里是动态的,例如插入下面这张gif图. 在软件里显示的同样是这样的动态效果: 那 ...

  9. [MFC]选择目录对话框和选择文件对话框

    在MFC编程中经常会需要用到选择目录和选择文件的界面,以下总结一下本人常用的这两种对话框的生成方法: 选择目录对话框 //选择目录按钮void CDcPackerDlg::OnBnClickedDec ...

  10. 在Ubuntu14.10中部署Hadoop2.6.0单节点伪分布集群

    1. 环境信息如下: ubuntu:14.10 jdk:openjdk-1.7.0 hadoop:2.6.0 2. 下载hadoop2.6.0, http://apache.fayea.com/had ...