可靠通信的保障 —— 使用ACK机制发送自定义信息——ESFramework 通信框架4.0 快速上手(12)

      (本文所介绍的新功能位于2011.04.18发布的最新版本中,此次版本变更请参见ESFramework通信框架通信框架 4.0 版本升级说明(持续更新)

      使用ESPlus.Application.CustomizeInfo.Passive.ICustomizeInfoOutter接口的Send方法,我们已经可以给服务端或其它在线客户端发送自定义信息了,那么,如何得知接收方是否已经收到了我们发出的信息了呢?特别是针对一些非常重要的信息,确认对方已经收到是非常重要的。ICustomizeInfoOutter接口增加了SendCertainly方法来解决这个问题。

 

一.启用ACK机制

      ACK,即确认的意思。当我们发送一个自定义信息给对方时,对方收到信息后,回复一个ACK给我们,我们接收到了ACK,就知道对方一定收到信息了。

    

      ICustomizeInfoOutter接口的SendCertainly方法就是启用了带ACK机制的发送:

        /// <summary>
        /// 向服务器发送二进制信息,并等待服务器的ACK。当前调用线程会一直阻塞,直到收到ACK;如果超时都没有收到ACK,则将抛出Timeout异常。
        /// </summary>
        /// <param name="informationType">自定义信息类型</param>
        /// <param name="info">二进制信息</param>
        void SendCertainly(int informationType, byte[] info);

        /// <summary>
        /// 向在线用户targetUserID发送二进制信息,并等待其ACK。当前调用线程会一直阻塞,直到收到ACK;如果超时都没有收到ACK,则将抛出Timeout异常。
        /// </summary>
        /// <param name="targetUserID">接收消息的目标用户ID</param>
        /// <param name="informationType">自定义信息类型</param>
        /// <param name="info">二进制信息</param>      
        void SendCertainly(string targetUserID, int informationType, byte[] info);

      同样的,服务端ICustomizeInfoController接口的SendCertainly方法,也是启用了带ACK机制的发送:

        /// <summary>
        /// 向ID为userID的在线用户发送二进制信息,并等待其ACK。当前调用线程会一直阻塞,直到收到ACK;如果超时都没有收到ACK,则将抛出Timeout异常。
        /// </summary>
        /// <param name="userID">接收消息的用户ID</param>
        /// <param name="informationType">自定义信息类型</param>
        /// <param name="info">二进制信息</param>          
        void SendCertainly(string userID, int informationType, byte[] info);

(1)无论是客户端发送信息给服务端、还是客户端发送信息给其它客户端、或者是服务端发送信息给客户端,它们采用的ACK机制的原理是一样的。

(2)当框架接收到需要ACK的信息时,会自动回复ACK给发送方。这是由ESPlus底层自动完成的,应用程序不需要关心。

(3)ESPlus会先回复ACK,然后才会调用处理信息的方法。所以,当发送方接收到ACK回复时,只是意味着接收方已经接收到了信息,并不表示接收方已经处理完了信息。

(4)如果接收方在规定的时间内(默认为30秒)都没有收到ACK,则会抛出超时的异常。当然,在规定的时间内没有收到ACK,并不一定就是接收方没有收到信息,而是有几种可能性:

       a.由于网络慢,导致ACK延迟抵达发送方。

       b.接收方已经掉线。

       c.发送方已经掉线。

(5)SendCertainly方法采用的是阻塞模型,即只有收到ACK后才会返回,否则一直阻塞当前调用线程。如果既需要ACK机制的发送,又不希望阻塞当前线程,那么,可以异步调用SendCertainly方法,并通过回调获知是否有超时异常。

(6)ESPlus.Application.CustomizeInfo命名空间下的主要接口的方法已经比较多了,我们这里厘清一下。比如,客户端由ICustomizeInfoOutter接口发出的CommitRequest调用将被服务端ICustomizeInfoBusinessHandler接口的HandleRequest方法来处理,下图我们通过箭头将这些调用与处理关联起来:

     

 

二.具有同样效果的同步调用

      使用自定义信息,我们还有几个同步调用的方法,比如ICustomizeInfoOutter接口的CommitRequest方法和CommitP2PRequest方法、以及ICustomizeInfoController接口的QueryClient方法,这些同步调用的方法都是有返回值的,如果超时没有收到返回的信息,也抛出超时异常。

      同步调用与带ACK机制的发送采用的是完全相同的模型,我们完全可以使用同步调用来模拟ACK机制,比如,需要确认的信息就使用同步调用发送,接收方在处理同步调用的时候直接返回null,就可以达到同样的效果。

       同步调用与带ACK机制的发送有两点小区别:

(1)在同步调用中,接收方回复的是对应请求的答案;在带ACK机制的发送中,接收方回复的是ACK。

(2)在同步调用中,接收方是处理完信息后才回复;在带ACK机制的发送中,接收方则是先回复ACK,再处理收到信息。

      由于同步调用和带ACK机制的发送都有可能超时抛出异常,所以,我们在程序中应当将其try...catch起来,以防止应用程序抛出未被截获的异常。 

 

 三.在消息骨架流程中挂接ACK机制

      如果不使用Rapid引擎,而自己来组装消息处理流程,我们就可以直接在消息骨架流程上,挂接一个自定义的IMessageSpy,来自动回复那些需要ACK的消息。并且,这种方式的优势在于,我们可以对任意类型的消息采用ACK机制,而本文介绍的SendCertainly方法只是针对自定义信息启用ACK机制。当然,对于Rapid引擎的使用者来说,用得最多的也就是自定义信息,所以,也应该足够了。(关于如何让协议类序列化达到最高性能且得到最精简的自定义信息,请参见ESFramework通信框架通信框架 4.0 快速上手(11) -- 使用紧凑的序列化器,数倍提升性能

 

ESFramework通信框架通信框架 4.0 概述

ESFramework通信框架通信框架 4.0 有哪些优点?

ESFramework通信框架通信框架 4.0 版本升级说明(持续更新)

《ESFramework通信框架通信框架 4.0 快速上手》系列所有文章

《ESFramework通信框架通信框架 4.0 高级进阶》系列所有文章 

 

时间: 2024-09-21 01:37:27

可靠通信的保障 —— 使用ACK机制发送自定义信息——ESFramework 通信框架4.0 快速上手(12)的相关文章

判定生死的心跳机制 --ESFramework 4.0 快速上手(07)

      在Internet上采用TCP进行通信的系统,都会遇到一个令人头疼的问题,就是"掉线".而"TCP掉线"这个问题远比我们通常所能想象的要复杂的多 -- 网络拓扑纷繁复杂.而从始节点A到终节点B之间可能要经过N多的交换机.路由器.防火墙等等硬件设备,每个硬件设备的相关设定也不统一,再加上网络中可能出现的拥塞.延迟等,使得我们在编程时,处理掉线也非常棘手.   一.从程序的角度看待TCP掉线       TCP掉线的原因可能多种多样.不一而足,比如,客人的电

ESFramework 通信框架安全机制的设计与实现

      在分布式通信系统中,安全无疑是非常重要的.ESFramework通信框架提供了哪些安全保障了?由于ESFramework通信框架是应用层的开发框架,那么本文我们只讨论ESFramework通信框架在应用层涉及到的安全问题.如果黑客是在网络层或链路层进行攻击,位于应用层的系统是无能为力的.从应用层来说,安全的重要性主要体现在以下几个方面:(1) 防止恶意用户使用格式不正确的消息来试探服务端.(2) 防止通信的消息被恶意用户截获,或者,即使被恶意用户截获,也无法破解其内容.(3) 防止恶

ActiveMQ消息传送机制以及ACK机制详解 AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的

ActiveMQ消息传送机制以及ACK机制详解     AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的.   一. ActiveMQ消息传送机制     Producer客户端使用来发送消息的, Consumer客户端用来消费消息:它们的协同中心就是ActiveMQ broker,broker也是让producer和consumer调用过程解耦的工具,最终实现了异步RPC

【转】ActiveMQ消息传送机制以及ACK机制详解

本文转载自 http://shift-alt-ctrl.iteye.com/blog/2020182 AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的.   一. ActiveMQ消息传送机制     Producer客户端使用来发送消息的, Consumer客户端用来消费消息:它们的协同中心就是ActiveMQ broker,broker也是让producer和consu

handler-android使用netty框架与PC服务端通信,接收到内容与发送内容不同

问题描述 android使用netty框架与PC服务端通信,接收到内容与发送内容不同 例如PC端发送888,android端却收到888后面还跟着一大串以前测试时候的内容, 部分代码如下,复制时括号有些错乱请勿在意: Bootstrap configureBootstrap(Bootstrap b, EventLoopGroup g) { b.group(g) .channel(NioSocketChannel.class) .remoteAddress(parements.getString(

数据接受-c#串口通信延迟问题,数据的发送和接受

问题描述 c#串口通信延迟问题,数据的发送和接受 在vs2010中调试运行,功能都完整,为什么在debug下运行exe文件.功能就会出现问题 自己认为是接受数据的时候发生了延迟. comm_DataReceived 接受代码: int n = serialPort1.BytesToRead; byte[] buf = new byte[n]; serialPort1.Read(buf, 0, n); buffer.AddRange(buf); if (!isDataReceived) { buf

上海移动:通信网络保障服务基础

硅谷网11月9日讯 网络质量与信息安全,是通信运营商的立足之本.在提升面向终端服务.渗透更多移动互联网服务产业环节的同时,保障通信通常与安全成为构建综合竞争力的基础话题. 昨天,中国共产党第十八次全国代表大会召开,引来全国及全球瞩目.保障"十八大"期间高质量网络通信的同时,上海移动也正在继续强化通信社会公共服务的网络建设,为社会民生提供更为先进. 稳定的 网络环境. 上海作为全国的金融中心与航运中心,一直以来承接着 各类重大会议和赛事.2010年的世博会.2011年的世游赛.2012年

PC_android使用socket通信,要求PC服务端发送图片给手机客户端,并在手机显示

问题描述 PC_android使用socket通信,要求PC服务端发送图片给手机客户端,并在手机显示 本人根据"http://sishuok.com/forum/posts/list/1995.html"此网址,做了一个socket通信的例子,但是通信成功了,图片在手机中显示不出来,求解答 解决方案 http://www.cnblogs.com/tt_mc/archive/2010/06/04/1751260.html 解决方案二: http://blog.csdn.net/tobac

福建:小区通信要保障各企业平等接入

本报讯 福建省通信管理局日前出台规定,进一步规范住宅小区及商住楼通信配套设施的建设和使用,确保广大用户通信需求,保障各企业的公平竞争和平等接入. 根据相关规定,新建小区通信配套设施要纳入小区建设规划范围,小区内通信配套设施的设计与施工应纳入小区建设项目的总体管理范畴.各基础电信业务经营者或各地通信行业协会在参与小区通信配套设施项目设计会审及竣工验收时,要注意把关项目是否按分工界面要求设置,并能满足三家电信业务经营者的接入需求,未达到标准的应要求建设单位整改到位.未按相关规范标准设置或整改不合格的