新建一歌ILogger接口和实现该接口的Logger类
在ILogger接口中
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
namespace WCF双工
{
/// <summary>
/// 1 将接口标记成一个双工通讯接口
/// CallbackContract:回调的接口
/// </summary>
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IResult))]
public interface ILogger
{
/// <summary>
/// 3 此方法也必须是一个数据报的方法
/// </summary>
/// <param name="logtxt"></param>
[OperationContract(IsOneWay = true)]
void WriteLog(string logtxt);
}
/// <summary>
/// 2 接口的名称可以由程序员自行定义
/// </summary>
public interface IResult
{
/// <summary>
/// 2.1 特点:此方法必须是一个数据报的方法
/// </summary>
/// <param name="msg"></param>
[OperationContract(IsOneWay = true)]
void WriteResult(string msg);
}
需要注意:将接口标记为一个双工通讯接口,即添加[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IResult))]
其中IResult接口是为了实现双工通讯,该接口下的方法需要将特性设置为数据报的方法
Logger类中
using System.Diagnostics;
using System.ServiceModel;
namespace WCF双工
{
public class Logger : ILogger
{
IResult iresult;
/// <summary>
/// 4.0 构造函数中接收在客户端实现了IResult的子类的对象实例
/// </summary>
public Logger()
{
//获取了客户端的IResult的具体实现类的对象实例
//OperationContext当前执行方法的上下文
//GetCallbackChannel执行当前回调的管道
iresult = OperationContext.Current.GetCallbackChannel<IResult>();
//给客户端的调用的方法,需要等待休眠时间结束才返回,但线程不被影响
public void WriteLog(string logtxt)
//1.0 接收到数据以后需要5秒钟才能处理完成
Stopwatch stop = new Stopwatch();
stop.Start();
System.Threading.Thread.Sleep(5000);
stop.Stop();
//2.0 通过回调客户端的函数将处理结果响应给客户端
iresult.WriteResult("您的请求已经处理成功,耗时" + stop.Elapsed.Seconds + "秒钟");
注意:Logger构造函数接收在客户端实现了IResult的子类的对象实例,调用当前操作的客户端实例的管道
修改配置文件
在Client中
添加对WCF服务的引用
新建一个Windows窗体应用程序(即客户端Client)和一个WCF服务库(WCF双工)在WCF双工项目下:新建一歌ILogger接口和实现该接口的Logger类在ILogger接口中using System;using System.Collections.Generic;using System.Linq;using System.Runtime.Serialization;using Sy...
请求-响应通信是最常规的用于
客户
端
与服务之间信息交换的模式。通信由
客户
端
发起,之后服务将响应消息发送给
客户
端
。这种模式有一个弊
端
就是,服务总是被动的提供响应。假如服务需要给
客户
端
发出一个通知或者警报,请求-响应这种单工模式就无法满足需求了。
这次要说的就是
双工
通信模式,该模式下服务可以向任一方发送未经请求的消息。当然
双工
通信也可以是单向的。
下面我们来看看其服务
端
是如何
实现
的。
//这里定义服务接口和回调函数接口
[ServiceContract(CallbackContract =typ
WCF
在通信过程中有三种模式:请求与答复、单向、
双工
通信。以下我们一一介绍。
请求与答复模式:
客户
端
发送请求,然后一直等待服务
端
的响应(异步
调用
除外),期间处于假死状态,直到服务
端
有了答复后才能继续执行其他程序
单向模式:
客户
端
向服务
端
发送求,但是不管服务
端
是否执行完成就接着执行下面的程序。
双向模式:
双工
模式建立在上面两种模式的基础之上,
实现
客户
端
与服务
端
相互的
调用
。相互
调用
:以往我们只是在
客户
端
调用
服务
端
,然后服务
端
有返回值返回
客户
端
,而相互
调用
不光是
客户
端
调用
服务
端
,而且服务
端
也可以
调用
客户
端
的方法。
WCF
的全称是WindowsCommunicationFoundation,Windows通信基础。
WCF
本质是面向服务的。主要分为服务
端
和
客户
端
两部分。
主机进程就是服务
端
,在其中需要创建服务,然后将服务通过EndPoint(终结点)与
客户
端
进行通信。
客户
端
在使用服务时,需要首先创建一个代理服务,然后
调用
这个代理服务。
1.服务
端
提供了什么服务,都具备...
服务
端
监控
客户
端
是否离线,心跳包出场,
客户
端
每5秒钟想服务器回发一次,若服务器监控到某个
客户
端
的最后更新时间比现在大5秒则做离线处理,移除
客户
端
。
具体
实现
是,当
客户
端
注册到服务器时,服务器将
客户
端
添加到一个字典中,这个字典中保存有
客户
端
名称和添加时间,以后由
客户
端
定时心跳来更新服务器上的这个字典集合,在服务中会有一个定时器,500毫秒一次去检测这个集合,如果发现有大于5秒钟还未更新的
客户
端
,则从回调句柄集合中移除,由此避免句柄的
调用
异常问题。
客户
端
定时
调用
update进行更新。
要
实现
两个服务器之间的数据传输,可以使用C#
WCF
(Windows Communication Foundation)框架。以下是一些基本步骤:
1. 定义服务契约(Service Contract):定义服务契约,包括服务的操作(Operation)和数据合同(Data Contract)。操作定义了服务接口,数据合同定义了传输的数据类型。
2.
实现
服务契约(Service Implementation):在服务器
端
实现
服务契约,
实现
服务的操作逻辑。
3. 配置服务终结点(Service Endpoint):配置服务的地址、绑定和协议等信息,以便
客户
端
可以访问服务。终结点包括服务终结点和元数据终结点。
4.
客户
端
代理(Client Proxy):在
客户
端
生成
客户
端
代理,使得
客户
端
可以
调用
服务契约中的操作。
客户
端
代理可以使用svcutil.exe命令行工具或Visual Studio工具自动生成。
5.
调用
服务:在
客户
端
中
调用
服务契约中的操作,从而
实现
数据的传输。
需要注意的是,服务契约的定义和
实现
必须在两个服务器之间共享,服务终结点的配置也必须适合两个服务器之间的网络环境,比如可以使用TCP协议或HTTP协议等。同时,还需要考虑服务的安全性、可靠性等方面的问题,以保证数据传输的安全和稳定。
CSDN-Ada助手:
C# 使用WebSocket创建聊天室案例
C#中Socket的简单使用
C# 使用WebSocket创建聊天室案例
Edmund_G:
C#图片处理示例(裁剪,缩放,清晰度,水印)
qq_36416292: