歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

使用Mina模擬短信的收發

資料參考來源自李海峰,並略作修改。

Apache_Mina_Server_2.0中文參考手冊V1.0 PDF版下載

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /2012年資料/11月/24日/使用Mina模擬短信的收發/Apache_Mina_Server_2.0中文參考手冊V1.0 PDF版

This is Apache Mina 2.0.4, Let`s drink code....


下面是用於模擬短信協議內容的實體類

  1. package com.mina.model; 
  2.  
  3. /** 
  4.  * 模擬短信協議內容的對象 
  5.  * @see M sip:wap.fetion.com.cn SIP-C/2.0 //狀態行,一般表示協議的名字、版本號等 
  6.  * @see S: 1580101xxxx                    //短信的發送號碼 
  7.  * @see R: 1880202xxxx                    //短信的接收號碼 
  8.  * @see L: 21                             //短信的字節數 
  9.  * @see 你好!!Hello World!!               //短信的內容 
  10.  * @see 上面每行的末尾使用ASCII的10(\n)作為換行符 
  11.  */ 
  12. public class SmsObject { 
  13.     private String sender;   //短信發送者  
  14.     private String receiver; //短信接收者  
  15.     private String message;  //短信內容  
  16.     /*三個屬性的getter和setter略*/ 

下面是Mina編寫的服務端主類MyServer.java

  1. package com.mina.server; 
  2.  
  3. import java.io.IOException; 
  4. import java.net.InetSocketAddress; 
  5. import java.nio.charset.Charset; 
  6.  
  7. import org.apache.mina.core.service.IoAcceptor; 
  8. import org.apache.mina.core.session.IdleStatus; 
  9. import org.apache.mina.filter.codec.ProtocolCodecFilter; 
  10. import org.apache.mina.transport.socket.nio.NioSocketAcceptor; 
  11.  
  12. import com.mina.factory.CmccSipcCodecFactory; 
  13.  
  14. public class MyServer { 
  15.     public static void main(String[] args) throws IOException { 
  16.         IoAcceptor acceptor = new NioSocketAcceptor(); 
  17.         acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10); 
  18.         acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new CmccSipcCodecFactory(Charset.forName("UTF-8")))); 
  19.         acceptor.setHandler(new ServerHandler()); 
  20.         acceptor.bind(new InetSocketAddress(9876)); 
  21.         System.out.println("Mina Server is Listing on := 9876"); 
  22.     } 

下面是服務端的消息處理器ServerHandler.java

  1. package com.mina.server; 
  2.  
  3. import org.apache.mina.core.service.IoHandlerAdapter; 
  4. import org.apache.mina.core.session.IoSession; 
  5.  
  6. import com.mina.model.SmsObject; 
  7.  
  8. public class ServerHandler extends IoHandlerAdapter { 
  9.     @Override 
  10.     public void messageReceived(IoSession session, Object message) throws Exception { 
  11.         SmsObject sms = (SmsObject)message; 
  12.         System.out.println("The message received from Client is [" + sms.getMessage() + "]"); 
  13.     } 
  14.     @Override 
  15.     public void sessionOpened(IoSession session) throws Exception{ 
  16.         System.out.println("InComing Client:" + session.getRemoteAddress()); 
  17.     } 

下面是Mina編寫的客戶端主類MyClient.java

  1. package com.mina.client; 
  2.  
  3. import java.net.InetSocketAddress; 
  4. import java.nio.charset.Charset; 
  5.  
  6. import org.apache.mina.core.service.IoConnector; 
  7. import org.apache.mina.filter.codec.ProtocolCodecFilter; 
  8. import org.apache.mina.transport.socket.nio.NioSocketConnector; 
  9.  
  10. import com.mina.factory.CmccSipcCodecFactory; 
  11.  
  12. public class MyClient { 
  13.     public static void main(String[] args) { 
  14.         IoConnector connector = new NioSocketConnector(); 
  15.         connector.setConnectTimeoutMillis(3000); 
  16.         connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new CmccSipcCodecFactory(Charset.forName("UTF-8")))); 
  17.         connector.setHandler(new ClientHandler()); 
  18.         connector.connect(new InetSocketAddress("localhost", 9876)); 
  19.     } 
  20. }

下面是客戶端的消息處理器ClientHandler.java

  1. package com.mina.client; 
  2.  
  3. import org.apache.mina.core.service.IoHandlerAdapter; 
  4. import org.apache.mina.core.session.IoSession; 
  5.  
  6. import com.mina.model.SmsObject; 
  7.  
  8. public class ClientHandler extends IoHandlerAdapter { 
  9.     @Override 
  10.     public void sessionOpened(IoSession session) throws Exception { 
  11.         SmsObject sms = new SmsObject(); 
  12.         sms.setSender("15025302990"); 
  13.         sms.setReceiver("13716700602"); 
  14.         sms.setMessage("Hi Jadyer,這是我用Mina2.x發給你的消息...."); 
  15.         session.write(sms); 
  16.     } 

下面是我們自定義的編解碼工廠類CmccSipcCodecFactory.java

  1. package com.mina.factory; 
  2.  
  3. import java.nio.charset.Charset; 
  4.  
  5. import org.apache.mina.core.session.IoSession; 
  6. import org.apache.mina.filter.codec.ProtocolCodecFactory; 
  7. import org.apache.mina.filter.codec.ProtocolDecoder; 
  8. import org.apache.mina.filter.codec.ProtocolEncoder; 
  9.  
  10. import com.mina.codec.CmccSipcDecoder; 
  11. import com.mina.codec.CmccSipcEncoder; 
  12.  
  13. /** 
  14.  * 自定義編解碼工廠 
  15.  * @see 實際上這個工廠類就是包裝了編碼器、解碼器 
  16.  * @see 通過接口中的getEncoder()、getDecoder()方法向ProtocolCodecFilter過濾器返回編解碼器實例 
  17.  * @see 以便在過濾器中對數據進行編解碼 
  18.  */ 
  19. public class CmccSipcCodecFactory implements ProtocolCodecFactory { 
  20.     private final CmccSipcEncoder encoder; 
  21.     private final CmccSipcDecoder decoder; 
  22.     public CmccSipcCodecFactory(){ 
  23.         this(Charset.defaultCharset()); 
  24.     } 
  25.     public CmccSipcCodecFactory(Charset charset){ 
  26.         this.encoder = new CmccSipcEncoder(charset); 
  27.         this.decoder = new CmccSipcDecoder(charset); 
  28.     } 
  29.     @Override 
  30.     public ProtocolDecoder getDecoder(IoSession arg0) throws Exception { 
  31.         return decoder; 
  32.     } 
  33.     @Override 
  34.     public ProtocolEncoder getEncoder(IoSession arg0) throws Exception { 
  35.         return encoder; 
  36.     } 

重頭戲:下面是我們自定義的編碼器CmccSipcEncoder.java

  1. package com.mina.codec; 
  2.  
  3. import java.nio.charset.Charset; 
  4. import java.nio.charset.CharsetEncoder; 
  5.  
  6. import org.apache.mina.core.buffer.IoBuffer; 
  7. import org.apache.mina.core.session.IoSession; 
  8. import org.apache.mina.filter.codec.ProtocolEncoderAdapter; 
  9. import org.apache.mina.filter.codec.ProtocolEncoderOutput; 
  10.  
  11. import com.mina.model.SmsObject; 
  12.  
  13. /** 
  14.  * 自定義編碼器 
  15.  * Mina中編寫編碼器可以實現ProtocolEncoder,其中有encode()、dispose()兩個方法需要實現 
  16.  * dispose()用於在銷毀編碼器時釋放關聯的資源,由於該方法一般我們並不關心,故通常直接繼承適配器ProtocolEncoderAdapter 
  17.  * @see ============================================================================================================== 
  18.  * @see 相比較解碼(字節轉為JAVA對象,也叫拆包)來說,編碼(Java對象轉為字節,也叫做打包)就很簡單了 
  19.  * @see 我們只需要把Java對象轉為指定格式的字節流,然後write()就可以了 
  20.  * @see ============================================================================================================== 
  21.  * @see 解碼器的編寫有以下幾個步驟 
  22.  * @see 1、將encode()方法中的message對象強制轉換為指定的對象類型 
  23.  * @see 2、創建IoBuffer緩沖區對象,並設置為自動擴展 
  24.  * @see 3、將轉換後的message對象中的各個部分按照指定的應用層協議進行組裝,並put()到IoBuffer緩沖區 
  25.  * @see 4、數據組裝完畢後,調用flip()方法,為輸出做好准備 
  26.  * @see    切記在write()方法之前調用IoBuffer的flip()方法,否則緩沖區的position的後面是沒有數據可以用來輸出的 
  27.  * @see    你必須調用flip()方法將position移至0,limit移至剛才的position。這個flip()方法的含義請參看java.nio.ByteBuffer 
  28.  * @see 5、最後調用ProtocolEncoderOutput的write()方法輸出IoBuffer緩沖區實例 
  29.  * @see ============================================================================================================== 
  30.  */ 
  31. public class CmccSipcEncoder extends ProtocolEncoderAdapter { 
  32.     private final Charset charset; 
  33.     public CmccSipcEncoder(Charset charset){ 
  34.         this.charset = charset; 
  35.     } 
  36.  
  37.     /** 
  38.      * 依據傳入的字符集類型對message對象進行編碼 
  39.      * 編碼的方式就是按照短信協議拼裝字符串到IoBuffer緩沖區,然後調用ProtocolEncoderOutput的write()方法輸出字節流 
  40.      */ 
  41.     @Override 
  42.     public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception { 
  43.         SmsObject sms = (SmsObject)message; 
  44.         CharsetEncoder ce = charset.newEncoder(); 
  45.         IoBuffer buffer = IoBuffer.allocate(100).setAutoExpand(true); 
  46.         String statusLine = "M sip:wap.fetion.com.cn SIP-C/2.0"; 
  47.         String sender = sms.getSender(); 
  48.         String receiver = sms.getReceiver(); 
  49.         String smsContent = sms.getMessage(); 
  50.         buffer.putString(statusLine+'\n', ce); 
  51.         buffer.putString("S: "+sender+'\n', ce); 
  52.         buffer.putString("R: "+receiver+'\n', ce); 
  53.         //使用String類與Byte[]類型之間的轉換方法獲得轉為字節流後的字節數  
  54.         buffer.putString("L: "+smsContent.getBytes(charset).length+'\n', ce); 
  55.         buffer.putString(smsContent, ce); 
  56.         buffer.flip(); 
  57.         out.write(buffer); 
  58.     } 
Copyright © Linux教程網 All Rights Reserved