`

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

    博客分类:
  • MINA
阅读更多

作者: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>  
分享到:
评论

相关推荐

    mina 开发需要的类库。。

    2. **mina-integration-spring**:如果你的项目使用Spring框架,此模块可以帮助你集成MINA,利用Spring的依赖注入和配置管理能力。 3. **mina-protocol-XXX**:MINA提供了多种协议实现,如TCP、UDP、SSL/TLS等,...

    apache ftpserver jar包

    5. **安全与权限控制**:可以配置SSL/TLS加密传输,以及用户访问权限,确保数据安全。 总之,Apache FtpServer提供了一套完整的FTP服务解决方案,并且能够很好地融入Spring生态,使得在Java应用中搭建和管理FTP...

    java开源包10

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包3

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包4

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包1

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包8

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包11

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包2

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包7

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包9

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包6

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包5

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包101

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    Java资源包01

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

Global site tag (gtag.js) - Google Analytics