注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Bioinformatics home

 
 
 

日志

 
 

实时调用短信接口  

2010-02-24 13:29:03|  分类: 编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
我们的短信接口肩负着批量发送各种短信的任务,主流用法是将要发送的各种信息插进数据库,然后短信接口定期读取发送。
如果是有些短信需要马上发出去,比如短信验证码,怎么办?
我采用了远程调用来实现。需要马上发送短信的应用程序,可以使用这个远程调用。
问题是,我们这个短信接口是HTTP的,短信发送的前提是要跟短信站点建立连接,也就是登录验证之类。并且同一时间只能有一个连接。这个地方登录了,别的地方想再登录是不行的。
所以只能共用一个连接。大批量定期发送这里是必须时时保持连接的(短信站点还要求我们用心跳方式每2分钟就连一次以保持连接呢),那么怎么照顾远程调用这里呢?或者说,远程调用过来了之后,发送模块怎么知道呢?
很自然想到了事件。
方法:
1、    新建一个短信调用类,编译成独立的DLL。这是为了方便应用程序和短信接口两方调用;

view plaincopy to clipboardprint?
public class SmsRemote : System.MarshalByRefObject   
{   
    public delegate void DglSend(string phone,string content);   
    public static event DglSend EventSend;   
    public static void Send(string phone,string content)   
    {   
        if (EventSend != null)   
        {   
            EventSend(phone, content);   
        }   
    }   
    public class SmsRemote : System.MarshalByRefObject
    {
        public delegate void DglSend(string phone,string content);
        public static event DglSend EventSend;
        public static void Send(string phone,string content)
        {
            if (EventSend != null)
            {
                EventSend(phone, content);
            }
        }
}      


2、    短信接口:
Program.cs:
//注册远程调用信道及短信调用对象 
            int port = 168;
            string sWellKnown = "SmsRemote";
            TcpServerChannel channel = new TcpServerChannel("tcpSmsRemote",port);
            ChannelServices.RegisterChannel(channel, false);            RemotingConfiguration.RegisterWellKnownServiceType(typeof(SmsRemote ), sWellKnown, WellKnownObjectMode.SingleCall);

Form1.cs:
//注册EventSend事件 
private void Form1_Load(object sender, EventArgs e)
{
SmsRemote.EventSend += new SmsRemote.DglSend(SmsRemote_EventSend);
}

//激发EventSend事件后调用的函数 
        void SmsRemote_EventSend(string phone, string content)
        {
//我们在这里将短信发送出去。 
    }

应用程序:
        sms.SmsRemote mLittleQiang;//小强!你怎么啦小强! 
        private void Form1_Load(object sender, EventArgs e)
        {
            ChannelServices.RegisterChannel(new TcpClientChannel("tcpSmsRemote",null), false);
            string address = "192.168.0.252";
            int port = 168;
            string sWellKnown = "SmsRemote";
            string sUrl = String.Format("tcp://{0}:{1}/{2}", address, port, sWellKnown);
            mLittleQiang = (sms.SmsRemote)Activator.GetObject(typeof(sms.SmsRemote), sUrl);
        }
        private void button3_Click(object sender, EventArgs e)
        {
            mLittleQiang.Send("139********", "执仔猪手,与猪偕老");
        }
只要mLittleQiang.Send(),就会激发函数SmsRemote_EventSend(string phone, string content)

  评论这张
 
阅读(1016)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017