源码下载

程序分四个部分:

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. golang学习之win7下go环境搭建

    以下均采用windows64环境,首先是go的下载,go有msi安装安装和zip解压安装两种安装方式,使用msi安装后go环境会自动配置,zip解压后需手动配置各种环境变量. 首先是下载,网上一搜一大 ...

  2. javaEE Design Patter(1)初步了解23种常用设计模式

    设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. ...

  3. maven <repositories>标签,<pluginRepositories>标签

    在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文件,如log4j.jar,junit.jar等等.每建立一个项 ...

  4. docker 数据卷挂载总结

    原文

  5. php查找字符串中第一个非0的位置截取

    $str = '00000000000000000000000000000000000000001234506'; $preg = '/[0]*/'; $result = preg_replace($ ...

  6. Safari无痕模式下,storage被禁用问题

    前言 Safari开启无痕模式后,localStorage和sessionStorage为空,对其进行set操作也会报错,也就是说这种情况下,storage是被禁止使用了.接下来说一下解决方法. 解决 ...

  7. 移动web开发ajax缓存操作

    移动web开发过程中网速是必须考虑的一个因素,所以一般是尽可能的在本地存储数据,避免弱网环境下请求数据失败导致页面没有内容的情况. 前后端分离是web开发的必然趋势,在PC端我们有时甚至为了避免aja ...

  8. c# json数组动态字段名

    根据给定的列名动态生成json数组 List<string> cols = new List<string>() { "姓名","性别" ...

  9. Java jdbc入门

    1 jdbc入门 1.1 之前操作数据 1)通过mysql的客户端工具,登录数据库服务器  (mysql -u root -p 密码) 2)编写sql语句 3)发送sql语句到数据库服务器执行 1.2 ...

  10. Java Jsp使用

    1.Jsp基础 1)Jsp的执行过程 tomcat服务器完成:jsp文件->翻译成java文件->编译成class字节码文件-> 构造类对象-> 调用方法 tomcat的wor ...