用Spring,smppapi,mina, commons ssl快速实现安全的smp(1)

本文介绍了一个基于Java的SMPP短消息中心实现方案,利用Apache Mina、Spring等技术搭建短信服务,支持多种消息处理,如绑定接收者、提交消息等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:lizongbo 发表于:1:19 下午. 星期二, 11月 27th, 2007
版权声明:可以任意转载,转载时请务必以超链接形式标明文章和作者信息及本版权声明


需要用到的java库有:

Apache mina : http://mina.apache.org

Spring: http://www.springframework.org/

smppapi http://smppapi.sourceforge.net/

commons ssl: http://juliusdavies.ca/commons-ssl/

smpp smsc Server的服务端启动代码:

  1. package com.lizongbo.smpp.server;   
  2. import org.apache.mina.filter.LoggingFilter;   
  3. import com.lizongbo.smpp.server.codec.SMPPProtocolCodecFactory;   
  4. import org.apache.mina.filter.codec.ProtocolCodecFilter;   
  5. import org.apache.mina.common.DefaultIoFilterChainBuilder;   
  6. import java.net.InetSocketAddress;   
  7. import org.apache.mina.common.IoAcceptorConfig;   
  8. import org.apache.mina.transport.socket.nio.SocketAcceptor;   
  9. import org.apache.mina.common.IoAcceptor;   
  10. import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;   
  11. import java.io.IOException;   
  12. import org.springframework.context.ApplicationContext;   
  13. import org.springframework.context.support.ClassPathXmlApplicationContext;   
  14. import java.util.Set;   
  15. import org.apache.mina.common.IoSession;   
  16. import ie.omk.smpp.*;   
  17. import ie.omk.smpp.message.*;   
  18. import ie.omk.smpp.util.PacketFactory;   
  19. import java.util.*;   
  20. import com.lizongbo.smpp.server.handlers.*;   
  21. /**  
  22. *  
  23. *Title: java smsc server  
  24. *  
  25. *Description: smpp短消息中心  
  26. *  
  27. *Copyright: Copyright (c) 2007  
  28. *  
  29. *Company: http://618119.com  
  30. *  
  31. * @author lizongbo  
  32. * @version 1.0  
  33. */  
  34. public class Main {   
  35. public static void main(String[] args) {   
  36. //以 spring配置方式启动   
  37. ApplicationContext context = new ClassPathXmlApplicationContext(   
  38. “classpath*:/springmina.xml”);   
  39. IoAcceptor acceptor = (IoAcceptor) context.getBean(”ioAcceptor”);   
  40. test(acceptor);   
  41. }   
  42. //普通方式启动   
  43. public static void commonmain(String[] args) throws IOException {   
  44. IoAcceptor acceptor = new SocketAcceptor();   
  45. IoAcceptorConfig config = new SocketAcceptorConfig();   
  46. DefaultIoFilterChainBuilder chain = config.getFilterChain();   
  47. chain.addLast(”logger”, new LoggingFilter());   
  48. chain.addLast(”codec”,   
  49. new ProtocolCodecFilter(new SMPPProtocolCodecFactory()));   
  50. chain.addLast(”threadpool”,   
  51. new org.apache.mina.filter.executor.ExecutorFilter());   
  52. InetSocketAddress serverAddr = new InetSocketAddress(5432);   
  53. SMPPServerSessionHandler handler = new SMPPServerSessionHandler();   
  54. Map<long> handles = new HashMap</long><long> ();   
  55. handles.put(Long.valueOf(0×00000002), new BindTransmitterHandler());   
  56. handles.put(Long.valueOf(0×00000001), new BindReceiverHandler());   
  57. handles.put(Long.valueOf(0×00000004), new SubmitSMHandler());   
  58. handles.put(Long.valueOf(0×00000006), new UnbindHandler());   
  59. handles.put(Long.valueOf(0×80000005), new DeliverSMRespHandler());   
  60. acceptor.bind(serverAddr, handler, config);   
  61. System.out.println(”Listening on port ” + 5432);   
  62. test(acceptor);   
  63. }</long>   
  64. private static void test(IoAcceptor acceptor) throws  
  65. InvalidParameterValueException {   
  66. try {   
  67. Thread.sleep(20000);   
  68. }   
  69. catch (InterruptedException ex) {   
  70. }   
  71. Set<iosession> ss = acceptor.getManagedSessions(new InetSocketAddress(5432));   
  72. System.out.println(”ss.size() == ” + ss.size());   
  73. if (ss.size() > 0) {   
  74. //模拟主动下发一条消息状态报告   
  75. DeliverSM rs = null;   
  76. try {   
  77. rs = (DeliverSM) PacketFactory.newInstance(SMPPPacket.DELIVER_SM);   
  78. }   
  79. catch (BadCommandIDException ex1) {   
  80. }   
  81. //这里还有很多字段没填,需要补上   
  82. rs.setSequenceNum(9999);   
  83. rs.setMessageId(”618119″);   
  84. rs.setServiceType(”aaa”);   
  85. rs.setSource(new Address(00, “618119″));   
  86. rs.setDestination(new Address(00, “10086″));   
  87. rs.setEsmClass(0);   
  88. rs.setProtocolID(0);   
  89. rs.setPriority(0);   
  90. rs.setRegistered(0);   
  91. rs.setReplaceIfPresent(0);   
  92. rs.setDataCoding(15);   
  93. rs.setDefaultMsg(1);   
  94. rs.setMessage(”succ”.getBytes());   
  95. System.out.println(”主动发回一个消息应答”);   
  96. ss.iterator().next().write(rs);   
  97. }   
  98. }</iosession>   
  99. }  
package com.lizongbo.smpp.server;
import org.apache.mina.filter.LoggingFilter;
import com.lizongbo.smpp.server.codec.SMPPProtocolCodecFactory;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.common.DefaultIoFilterChainBuilder;
import java.net.InetSocketAddress;
import org.apache.mina.common.IoAcceptorConfig;
import org.apache.mina.transport.socket.nio.SocketAcceptor;
import org.apache.mina.common.IoAcceptor;
import org.apache.mina.transport.socket.nio.SocketAcceptorConfig;
import java.io.IOException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Set;
import org.apache.mina.common.IoSession;
import ie.omk.smpp.*;
import ie.omk.smpp.message.*;
import ie.omk.smpp.util.PacketFactory;
import java.util.*;
import com.lizongbo.smpp.server.handlers.*;
/**
*
*Title: java smsc server
*
*Description: smpp短消息中心
*
*Copyright: Copyright (c) 2007
*
*Company: http://618119.com
*
* @author lizongbo
* @version 1.0
*/
public class Main {
public static void main(String[] args) {
//以 spring配置方式启动
ApplicationContext context = new ClassPathXmlApplicationContext(
“classpath*:/springmina.xml”);
IoAcceptor acceptor = (IoAcceptor) context.getBean(”ioAcceptor”);
test(acceptor);
}
//普通方式启动
public static void commonmain(String[] args) throws IOException {
IoAcceptor acceptor = new SocketAcceptor();
IoAcceptorConfig config = new SocketAcceptorConfig();
DefaultIoFilterChainBuilder chain = config.getFilterChain();
chain.addLast(”logger”, new LoggingFilter());
chain.addLast(”codec”,
new ProtocolCodecFilter(new SMPPProtocolCodecFactory()));
chain.addLast(”threadpool”,
new org.apache.mina.filter.executor.ExecutorFilter());
InetSocketAddress serverAddr = new InetSocketAddress(5432);
SMPPServerSessionHandler handler = new SMPPServerSessionHandler();
Map<long> handles = new HashMap</long><long> ();
handles.put(Long.valueOf(0×00000002), new BindTransmitterHandler());
handles.put(Long.valueOf(0×00000001), new BindReceiverHandler());
handles.put(Long.valueOf(0×00000004), new SubmitSMHandler());
handles.put(Long.valueOf(0×00000006), new UnbindHandler());
handles.put(Long.valueOf(0×80000005), new DeliverSMRespHandler());
acceptor.bind(serverAddr, handler, config);
System.out.println(”Listening on port ” + 5432);
test(acceptor);
}</long>
private static void test(IoAcceptor acceptor) throws
InvalidParameterValueException {
try {
Thread.sleep(20000);
}
catch (InterruptedException ex) {
}
Set<iosession> ss = acceptor.getManagedSessions(new InetSocketAddress(5432));
System.out.println(”ss.size() == ” + ss.size());
if (ss.size() > 0) {
//模拟主动下发一条消息状态报告
DeliverSM rs = null;
try {
rs = (DeliverSM) PacketFactory.newInstance(SMPPPacket.DELIVER_SM);
}
catch (BadCommandIDException ex1) {
}
//这里还有很多字段没填,需要补上
rs.setSequenceNum(9999);
rs.setMessageId(”618119″);
rs.setServiceType(”aaa”);
rs.setSource(new Address(0, 0, “618119″));
rs.setDestination(new Address(0, 0, “10086″));
rs.setEsmClass(0);
rs.setProtocolID(0);
rs.setPriority(0);
rs.setRegistered(0);
rs.setReplaceIfPresent(0);
rs.setDataCoding(15);
rs.setDefaultMsg(1);
rs.setMessage(”succ”.getBytes());
System.out.println(”主动发回一个消息应答”);
ss.iterator().next().write(rs);
}
}</iosession>
}

spring 的xml配置文件:

 

 

  1. <?xml version=”1.0″ encoding=”UTF-8″?>   
  2. <beans xmlns=”http://www.springframework.org/schema/beans/--escaped_anchor:e3d7b21df466d13b15e011f977f36957---beans-2.0.xsd   
  3. http://www.springframework.org/schema/aop/--escaped_anchor:e3d7b21df466d13b15e011f977f36957---aop-2.0.xsd   
  4. http://www.springframework.org/schema/util/--escaped_anchor:e3d7b21df466d13b15e011f977f36957---util-2.0.xsd “>   
  5. <util:constant id=”ie.omk.smpp.message.SMPPPacket.BIND_TRANSMITTER”/>   
  6. <bean id=”com.lizongbo.smpp.server.handlers.BindTransmitterHandler”/>   
  7. <bean id=”com.lizongbo.smpp.server.handlers.BindReceiverHandler”/>   
  8. <bean id=”com.lizongbo.smpp.server.handlers.SubmitSMHandler”/>   
  9. <bean id=”com.lizongbo.smpp.server.handlers.UnbindHandler”/>   
  10. <bean id=”com.lizongbo.smpp.server.handlers.DeliverSMRespHandler”/>   
  11. <util:map id=”handlers” key-type=”java.lang.Long”>   
  12. <!– Integer.decode(”0×80000005″)要出错,被迫用Long类型 –>   
  13. <entry key=”0×00000002″>   
  14. <ref local=”com.lizongbo.smpp.server.handlers.BindTransmitterHandler”/>   
  15. </entry>   
  16. <entry key=”0×00000001″>   
  17. <ref local=”com.lizongbo.smpp.server.handlers.BindReceiverHandler”/>   
  18. </entry>   
  19. <entry key=”0×00000004″>   
  20. <ref local=”com.lizongbo.smpp.server.handlers.SubmitSMHandler”/>   
  21. </entry>   
  22. <entry key=”0×00000006″>   
  23. <ref local=”com.lizongbo.smpp.server.handlers.UnbindHandler”/>   
  24. </entry>   
  25. <entry key=”0×80000005″>   
  26. <ref local=”com.lizongbo.smpp.server.handlers.DeliverSMRespHandler”/>   
  27. </entry>   
  28. </util:map>   
  29. <bean class=”org.springframework.beans.factory.config.CustomEditorConfigurer”>   
  30. <property name=”customEditors”>   
  31. <map>   
  32. <entry key=”java.net.SocketAddress”>   
  33. <bean class=”org.apache.mina.integration.spring.InetSocketAddressEditor”/>   
  34. </entry>   
  35. </map>   
  36. </property>   
  37. </bean>   
  38. <!– The IoHandler delegate implementation –>   
  39. <bean id=”smppHandler” class=”com.lizongbo.smpp.server.SMPPServerSessionHandler”>   
  40. <property name=”handles”>   
  41. <ref local=”handlers”/>   
  42. </property>   
  43. <property name=”readerIdleTimeout”>   
  44. <value>600</value>   
  45. </property>   
  46. </bean>   
  47. <!– The protocol codec factory for smpp –>   
  48. <bean id=”smppProtocolCodecFactory” class=”com.lizongbo.smpp.server.codec.SMPPProtocolCodecFactory”> </bean>   
  49. <bean id=”smppFilterThreadPoolFactory” class=”org.apache.mina.integration.spring.ThreadPoolExecutorFactoryBean”>   
  50. <property name=”corePoolSize” value=”10″/>   
  51. <property name=”maxPoolSize” value=”100″/>   
  52. <property name=”keepAliveSeconds” value=”30″/>   
  53. </bean>   
  54. <bean id=”smppFilterChainBuilder” class=”org.apache.mina.integration.spring.DefaultIoFilterChainBuilderFactoryBean”>   
  55. <property name=”filters”>   
  56. <list>   
  57. <bean class=”org.apache.mina.filter.executor.ExecutorFilter”>   
  58. <constructor-arg>   
  59. <ref bean=”smppFilterThreadPoolFactory”/>   
  60. </constructor-arg>   
  61. </bean>   
  62. <bean class=”org.apache.mina.filter.codec.ProtocolCodecFilter”>   
  63. <constructor-arg ref=”smppProtocolCodecFactory”/>   
  64. </bean>   
  65. <bean class=”org.apache.mina.filter.LoggingFilter”/>   
  66. </list>   
  67. </property>   
  68. <property name=”filterNamePrefix” value=”smppFilterPool”/>   
  69. </bean>   
  70. <bean id=”smppThreadModel” class=”org.apache.mina.integration.spring.ExecutorThreadModelFactoryBean”>   
  71. <property name=”serviceName” value=”smppService”/>   
  72. <property name=”executor”>   
  73. <bean class=”org.apache.mina.integration.spring.ThreadPoolExecutorFactoryBean”>   
  74. <property name=”corePoolSize” value=”6″/>   
  75. <property name=”maxPoolSize” value=”10″/>   
  76. <property name=”keepAliveSeconds” value=”30″/>   
  77. </bean>   
  78. </property>   
  79. </bean>   
  80. <bean id=”smppSocketAcceptorConfig” class=”org.apache.mina.transport.socket.nio.SocketAcceptorConfig”>   
  81. <property name=”filterChainBuilder” ref=”smppFilterChainBuilder”/>   
  82. <property name=”threadModel” ref=”smppThreadModel”/>   
  83. <property name=”reuseAddress” value=”true”/>   
  84. </bean>   
  85. <bean id=”threadExecutor” class=”java.util.concurrent.Executors” factory-method=”newCachedThreadPool”/>   
  86. <bean id=”ioAcceptor” class=”org.apache.mina.integration.spring.IoAcceptorFactoryBean”>   
  87. <property name=”target”>   
  88. <bean class=”org.apache.mina.transport.socket.nio.SocketAcceptor”>   
  89. <constructor-arg index=”0″>   
  90. <value>3</value>   
  91. </constructor-arg>   
  92. <constructor-arg index=”1″>   
  93. <ref bean=”threadExecutor”/>   
  94. </constructor-arg>   
  95. </bean>   
  96. </property>   
  97. <property name=”bindings”>   
  98. <list>   
  99. <bean class=”org.apache.mina.integration.spring.Binding”>   
  100. <property name=”address” value=”:5432″/>   
  101. <property name=”handler” ref=”smppHandler”/>   
  102. <property name=”serviceConfig” ref=”smppSocketAcceptorConfig”/>   
  103. </bean>   
  104. </list>   
  105. </property>   
  106. </bean>   
  107. <!– SMSC BEANS –>   
  108. <bean id=”smscFilterThreadPoolFactory” class=”org.apache.mina.integration.spring.ThreadPoolExecutorFactoryBean”>   
  109. <property name=”corePoolSize” value=”10″/>   
  110. <property name=”maxPoolSize” value=”100″/>   
  111. <property name=”keepAliveSeconds” value=”30″/>   
  112. </bean>   
  113. <bean id=”smscFilterChainBuilder” class=”org.apache.mina.integration.spring.DefaultIoFilterChainBuilderFactoryBean”>   
  114. <property name=”filters”>   
  115. <list>   
  116. <bean class=”org.apache.mina.filter.codec.ProtocolCodecFilter”>   
  117. <constructor-arg ref=”smppProtocolCodecFactory”/>   
  118. </bean>   
  119. <bean class=”org.apache.mina.filter.executor.ExecutorFilter”>   
  120. <constructor-arg>   
  121. <ref bean=”smscFilterThreadPoolFactory”/>   
  122. </constructor-arg>   
  123. </bean>   
  124. <bean class=”org.apache.mina.filter.LoggingFilter”/>   
  125. </list>   
  126. </property>   
  127. <property name=”filterNamePrefix” value=”smscFilterPool”/>   
  128. </bean>   
  129. <bean id=”smscThreadModel” class=”org.apache.mina.integration.spring.ExecutorThreadModelFactoryBean”>   
  130. <property name=”serviceName” value=”smscService”/>   
  131. <property name=”executor”>   
  132. <bean class=”org.apache.mina.integration.spring.ThreadPoolExecutorFactoryBean”>   
  133. <property name=”corePoolSize” value=”6″/>   
  134. <property name=”maxPoolSize” value=”10″/>   
  135. <property name=”keepAliveSeconds” value=”30″/>   
  136. </bean>   
  137. </property>   
  138. </bean>   
  139. <bean id=”smscSocketConnectorConfig” class=”org.apache.mina.transport.socket.nio.SocketConnectorConfig”>   
  140. <property name=”filterChainBuilder” ref=”smscFilterChainBuilder”/>   
  141. <property name=”threadModel” ref=”smscThreadModel”/>   
  142. </bean>   
  143. </beans>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值