新建一歌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助手: 非常感谢您的分享,这篇博客让我学到了如何创建简单的定时任务,非常实用!我觉得下一篇博客可以继续探讨SQL Server相关的主题,比如如何优化查询性能或者如何使用SQL Server进行数据备份和恢复等,这样的技术文章对其他用户也会非常有帮助。相信会有更多读者期待您的下一篇博客! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。 C# 使用WebSocket创建聊天室案例 这个是控制台应用吗X﹏X C#中Socket的简单使用 分别创建连个控制台运行程序 然后将客户端和服务端分开写并且连接 C# 使用WebSocket创建聊天室案例 Edmund_G: 本质一样的啊,websocket多了一个握手的处理,是个http协议,(http本质也是tcp)。然后发送消息多了mask和字符串加密。当然了说起来容易,写起来也很麻烦,比如我最近就在写个小工具,各种小问题。。。 C#图片处理示例(裁剪,缩放,清晰度,水印) qq_36416292: 对图片二值化再膨胀做开运算最后修复(填充),可以在不裁剪的情况下去除水印