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 ...
随机推荐
- 使用axis2调用webservice需要导入的依赖
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> &l ...
- SpringCloud实战之初级入门(一)— eureka注册中心
目录 写在前面 1.资料目录 2.环境介绍 3.eureka注册中心 3.1 创建工程 3.2 启动工程 5.eureka注册中心集群高可用 6.结语 7.一点点重要的事情 写在前面 我在软件行业浸泡 ...
- servlet开发(四)之ServletContext
接上一篇. 2.3.4 利用ServletContext对象读取资源文件 比如我们要读取web项目中的配置文件. 项目目录结构如下: 使用ServletContext对象读取资源文件的示例代码如下: ...
- thinkphp下通过页面链接传递的参数获取一次后失效
在thinkphp下通过页面链接传递的参数获取一次后失效,ajax内部无法再次使用.想要使用必须再次用js获取其值,通过ajax传递给后台使用. 1.通过页面链接传递参数给下一页 2.可以再下一页后台 ...
- Git更新或提交出错的解决办法
一.舍弃本地代码,用远端版本覆盖本地版本. 当自己本地修改很少,更新代码出现冲突时,“error: Your local changes to the following files would be ...
- Caffe&Torch&Theano&TensorFlow
https://www.youtube.com/watch?v=Qynt-TxAPOs&index=12&list=PL16j5WbGpaM0_Tj8CRmurZ8Kk1gEBc7fg ...
- matlab练习程序(三角形外接圆)
三角形两边的垂直平分线就能确定外接圆. 结果如下: matlab代码如下: clear all;close all;clc; p=rand(,); %(x,y) cen1=(p(,:)+p(,:))/ ...
- Http重要知识点
- 通过JavaScript创建Qml对象
有两种方法可以创建,都是全局对象Qt提供的方法 一:用Qt.createComponent加载一个qml文件并创建Component 二:用Qt.createQmlObject从一个qml字符串创建C ...
- JS获取屏幕分辨率以及当前对象大小等
<script type="text/javascript"> function getInfo(){ var s = ""; s += " ...