好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#短彩信模块开发设计

C#短彩信模块开发设计

准备从以下几个方面简单的谈谈短彩信模块的实现:

[短彩信]C#短彩信模块开发设计(1)——架构( http://www.cnblogs.com/CopyPaster/archive/2012/12/07/2806776.html )
[短彩信]C#短彩信模块开发设计(2)——配置( http://www.cnblogs.com/CopyPaster/archive/2012/12/10/2811626.html )
[短彩信]C#短彩信模块开发设计(3)——协议( http://www.cnblogs.com/CopyPaster/archive/2012/12/12/2814918.html )
[短彩信]C#短彩信模块开发设计(4)——其他( http://www.cnblogs.com/CopyPaster/archive/2012/12/17/2821715.html )

1)流控

    流控实现的方法很多种,大家去搜一个下,应该能找到很多的方式,下面简单说一下,我们的方式,下面是一个主要实现方法的概要:

 public   class   MtConnection
    {
          private   int   _maxSendCount;
          private   readonly   object  _sendCountLock =  new   object  ();
          private   int  _sendCount =  0  ;  
          private  DateTime _sendTime = DateTime.Now;       //  该条链路累计发送MT的时间间隔 500毫秒为一时间段 

         public  MtConnection( int   maxSendCount)
        {
            _maxSendCount  =  maxSendCount;
        }

          public   int   MaxSendCount
        {
              get  
            {
                  if  (DateTime.Now.Millisecond >=  500  )
                {
                      return  _maxSendCount /  2  ;
                }

                  return  _maxSendCount - (_maxSendCount /  2  );
            }
        }

          public   bool  IsOverSendCount( int   sendNum)
        {
              lock   (_sendCountLock)
            {
                DateTime now  =  DateTime.Now;
                  if  ((now - _sendTime).TotalMilliseconds >=  500  )
                {
                    _sendTime  =  now;
                    _sendCount  =  sendNum;
                }
                  else  
                {
                      if  ( this ._sendCount + sendNum >  this  .MaxSendCount)
                    {
                          return   true  ;
                    }

                    _sendCount  +=  sendNum;
                }

                  return   false  ;
            }
        }
    } 

 class   Program
    {
          static   void  Main( string  [] args)
        {
              var  mtConnection =  new  MtConnection( 10  );
              for  ( int  i =  0 ; i <=  1000000 ; i++ )
            {
                  if  (mtConnection.IsOverSendCount( 1  ))
                {
                    Console.WriteLine(  "  发送  "  + i +  "  超流控  "  );
                    Thread.Sleep(  1000  );
                }
                  else  
                {
                    Console.WriteLine(i);
                }
            }
        }
    } 

怎么样很简单吧,当然了,在我们实际的处理之中,如果判断某次的发送超过了流控阀值,不是简单的sleep,而是利用
ThreadPool.RegisterWaitForSingleObject(
 WaitHandle waitObject,
      WaitOrTimerCallback callBack,
      Object state,
     int millisecondsTimeOutInterval,
     bool executeOnlyOnce

)
向线程池添加一个可以定时执行的方法;(在我们的实现中对于延迟消息实际上会发送至一个System.Collections.Queue;原则是只要超流控,就入延迟队列;至于如何处理延迟,大家各自根据口味实现,不过要注意: 一定不能丢消息 ,不能说第一次延迟了,第二次就一定不延迟)

2)实时监控

     关于实时监控,我们借助Window性能计数器(Performance Counter),去实时统计发送速度、发送消息数量、滑动窗口消息数量、消息积压数、网关延迟等等信息;由于为了使用方便,我们对于性能计数器进行了一定的封装,这里就不贴具体的代码了。关于性能计数器的使用,大家可以去查一下相关的资料;总之,借助Window性能计数器(Performance Counter)进行实时监控,对于程序本省的资源损耗很低,大家可以认为可以忽略;大家可以在run中输入perfmon.exe打开性能监视器;

3)联调和工具

3.1)抓包工具: 

短信基于CMPP协议,在联调和排查问题的时候,往往需要先抓包,那可以使用:wireshark(wireshark支持以cmpp协议解码):

3.2)常用Dos命令:

telnet :在检查网络是否通畅时用此命令。

tracert :如果telnet不通,可以用此命令检查哪一步出问题了。

netstat :检查连接情况。

3.3)其他:

一般在本地开发过程之中需要简单写一个模拟构造消息的工具(下图的TestTool)和网关挡板(下图的DumyGateway),下图是彩信solution的结构,短信的类似;

 

 

标签:  S/MMS

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于C#短彩信模块开发设计的详细内容...

  阅读:43次

上一篇: 微软的免费电子书

下一篇:adapter pattern