Simple codec Implementation of Apache Mina Server

Source: Internet
Author: User
Tags object serialization throwable

Protocol codecs are the objects you need to pay attention to when using Mina, because the data transmitted over the network is binary data (bytes), and you are targeting Java objects in the program, this requires you to send data
When receiving data, the binary data is decoded into a Java object (this is not as simple as Java object serialization and deserialization ). Put the Code directly:

Server:

package com.cemso.mina.server;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.charset.Charset;import org.apache.mina.core.service.IoAcceptor;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.textline.TextLineCodecFactory;import org.apache.mina.filter.logging.LoggingFilter;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;import com.cemso.mina.coder.CmccSipcCodecFactory;/** * @author gl65293 */public class MinaTimeServer {    private static final int PORT = 9123;    public static void main(String[] args) throws IOException{        IoAcceptor acceptor = new NioSocketAcceptor();        acceptor.getFilterChain().addLast("logger", new LoggingFilter());//        acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));                acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new CmccSipcCodecFactory(Charset.forName("UTF-8"))));                acceptor.setHandler(new TimeServerHandler());        acceptor.getSessionConfig().setReadBufferSize(2048);        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);        acceptor.bind(new InetSocketAddress(PORT));    }}

package com.cemso.mina.server;/** * @author gl65293 * */import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.core.session.IoSession;import com.cemso.mina.dto.SmsObject;public class TimeServerHandler extends IoHandlerAdapter {    public TimeServerHandler() {    }    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {        cause.printStackTrace();    }    public void messageReceived(IoSession session, Object message) throws Exception {                SmsObject sms = (SmsObject)message;        System.out.println(sms.getMessage());        System.out.println(sms.getSender());        System.out.println(sms.getReceiver());            }    public void sessionIdle(IoSession session, IdleStatus status) throws Exception {        System.out.println((new StringBuilder()).append("IDLE ").append(session.getIdleCount(status)).toString());    }}

Dto:

package com.cemso.mina.dto;/** * @author gl65293 * */public class SmsObject {    private String sender;    private String receiver;    private String message;    /**     * @return the sender     */    public String getSender() {        return sender;    }    /**     * @param sender the sender to set     */    public void setSender(String sender) {        this.sender = sender;    }    /**     * @return the receiver     */    public String getReceiver() {        return receiver;    }    /**     * @param receiver the receiver to set     */    public void setReceiver(String receiver) {        this.receiver = receiver;    }    /**     * @return the message     */    public String getMessage() {        return message;    }    /**     * @param message the message to set     */    public void setMessage(String message) {        this.message = message;    }}

Encoder and decoder:

package com.cemso.mina.coder;import java.nio.charset.Charset;import org.apache.mina.core.session.IoSession;import org.apache.mina.filter.codec.ProtocolCodecFactory;import org.apache.mina.filter.codec.ProtocolDecoder;import org.apache.mina.filter.codec.ProtocolEncoder;/** * @author gl65293 * */public class CmccSipcCodecFactory implements ProtocolCodecFactory {    private final CmccSipcEncoder encoder;    private final CmccSipcDecoder decoder;        public CmccSipcCodecFactory(){        this(Charset.defaultCharset());    }    /**     * @param defaultCharset     */    public CmccSipcCodecFactory(Charset charSet) {        this.encoder = new CmccSipcEncoder(charSet);        this.decoder = new CmccSipcDecoder(charSet);    }    /* (non-Javadoc)     * @see org.apache.mina.filter.codec.ProtocolCodecFactory#getDecoder(org.apache.mina.core.session.IoSession)     */    @Override    public ProtocolDecoder getDecoder(IoSession iosession) throws Exception {        // TODO Auto-generated method stub        return decoder;    }    /* (non-Javadoc)     * @see org.apache.mina.filter.codec.ProtocolCodecFactory#getEncoder(org.apache.mina.core.session.IoSession)     */    @Override    public ProtocolEncoder getEncoder(IoSession iosession) throws Exception {        // TODO Auto-generated method stub        return encoder;    }}

package com.cemso.mina.coder;import java.nio.charset.Charset;import java.nio.charset.CharsetDecoder;import org.apache.mina.core.buffer.IoBuffer;import org.apache.mina.core.session.IoSession;import org.apache.mina.filter.codec.CumulativeProtocolDecoder;import org.apache.mina.filter.codec.ProtocolDecoderOutput;import com.cemso.mina.dto.SmsObject;/** * @author gl65293 * */public class CmccSipcDecoder extends CumulativeProtocolDecoder {    private final Charset charset;            /**     * @param charset     */    public CmccSipcDecoder(Charset charset) {        this.charset = charset;    }    /* (non-Javadoc)     * @see org.apache.mina.filter.codec.CumulativeProtocolDecoder#doDecode(org.apache.mina.core.session.IoSession, org.apache.mina.core.buffer.IoBuffer, org.apache.mina.filter.codec.ProtocolDecoderOutput)     */    @Override    protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {        // TODO Auto-generated method stub                IoBuffer buffer = IoBuffer.allocate(100).setAutoExpand(true);        CharsetDecoder decoder = charset.newDecoder();                int matchCount = 0;        String statusLine = "";        String sender = "";        String receiver = "";        String length = "";        String sms="";        int i = 1;                while(in.hasRemaining()){            byte b = in.get();            buffer.put(b);                        if(b == 10 && i < 5){                matchCount ++;                if(i == 1){                    buffer.flip();                    statusLine = buffer.getString(matchCount,decoder);                    statusLine = statusLine.substring(0, statusLine.length()-1);                    matchCount = 0;                    buffer.clear();                }                if(i == 2){                    buffer.flip();                    sender = buffer.getString(matchCount,decoder);                    sender = sender.substring(0, sender.length()-1);                    matchCount = 0;                    buffer.clear();                }                if(i == 3){                    buffer.flip();                    receiver = buffer.getString(matchCount,decoder);                    receiver = receiver.substring(0, receiver.length()-1);                    matchCount = 0;                    buffer.clear();                }                if(i == 4){                    buffer.flip();                    length = buffer.getString(matchCount,decoder);                    length = length.substring(0, length.length()-1);                    matchCount = 0;                    buffer.clear();                }                                i++;            }else if(i == 5){                matchCount ++;                if(matchCount == Long.parseLong(length.split(": ")[1])){                    buffer.flip();                    sms = buffer.getString(matchCount,decoder);                    i++;                    break;                }            }else{                matchCount ++;            }        }                SmsObject smsObject = new SmsObject();        smsObject.setSender(sender.split(": ")[1]);        smsObject.setReceiver(receiver.split(": ")[1]);        smsObject.setMessage(sms);                out.write(smsObject);                return false;    }}

package com.cemso.mina.coder;import java.nio.charset.Charset;import java.nio.charset.CharsetEncoder;import org.apache.mina.core.buffer.IoBuffer;import org.apache.mina.core.session.IoSession;import org.apache.mina.filter.codec.ProtocolEncoderAdapter;import org.apache.mina.filter.codec.ProtocolEncoderOutput;import com.cemso.mina.dto.SmsObject;/** * @author gl65293 * */public class CmccSipcEncoder extends ProtocolEncoderAdapter {    private final Charset charset;        public CmccSipcEncoder(Charset charset){        this.charset = charset;    }        /* (non-Javadoc)     * @see org.apache.mina.filter.codec.ProtocolEncoder#encode(org.apache.mina.core.session.IoSession, java.lang.Object, org.apache.mina.filter.codec.ProtocolEncoderOutput)     */    @Override    public void encode(IoSession iosession, Object obj, ProtocolEncoderOutput out) throws Exception {        // TODO Auto-generated method stub        SmsObject sms = (SmsObject)obj;        CharsetEncoder charst = charset.newEncoder();        IoBuffer buffer = IoBuffer.allocate(100).setAutoExpand(true);        String statusLine = "M sip:wap.fetion.com.cn SIP-C/2.0";        String sender = sms.getSender();        String recevier = sms.getReceiver();        String smsContent = sms.getMessage();                buffer.putString(statusLine+'\n', charst);        buffer.putString("S: "+sender+'\n', charst);        buffer.putString("R: "+recevier+'\n', charst);        buffer.putString("L: "+smsContent.getBytes(charset).length+"\n", charst);        buffer.putString(smsContent, charst);                buffer.flip();        out.write(buffer);    }}

Client:

Package COM. cemso. mina. client;/*** @ author gl65293 ***/import java.net. inetsocketaddress; import Java. NIO. charset. charset; import Org. apache. mina. core. service. ioconnector; import Org. apache. mina. filter. codec. protocolcodecfilter; import Org. apache. mina. filter. codec. textline. textlinecodecfactory; import Org. apache. mina. transport. socket. NIO. niosocketconnector; import COM. cemso. mina. coder. cmccsipccodecfacto Ry; // referenced classes of package Org. apache. mina. example. sumup: // clientsessionhandlerpublic class client {public client () {} public static void main (string ARGs []) throws throwable {/* If (ARGs. length = 0) {system. out. println ("Please specify the list of any integers"); return;} // prepare values to sum up int [] values = new int [args. length]; for (INT I = 0; I <args. length; I ++) {values [I] = integer. parseint (ARGs [I]);} niosocketconnector = new niosocketconnector (); // configure the service. connector. setconnecttimeoutmillis (connect_timeout); If (use_custom_codec) {connector. getfilterchain (). addlast ("codec", new protocolcodecfilter (New sumupprotocolcodecfactory (false);} else {connector. getfilterchain (). addlast ("codec", new protocolcodecfilter (New objectserializati Oncodecfactory ();} connector. getfilterchain (). addlast ("logger", new loggingfilter (); connector. sethandler (New clientsessionhandler (values); iosession session; For (;) {try {connectfuture future = connector. connect (New inetsocketaddress (hostname, Port); future. awaituninterruptibly (); Session = Future. getsession (); break;} catch (runtimeioexception e) {system. err. println ("failed to connec T. "); E. printstacktrace (); thread. sleep (5000) ;}// wait until the summation is done session. getclosefuture (). awaituninterruptibly (); connector. dispose (); */ioconnector conne= new niosocketconnector (); connector. sethandler (New clientsessionhandler ("Hello! \ R \ n haha! "); Connector. setconnecttimeoutmillis (30000); // connector. getfilterchain (). addlast ("codec", new protocolcodecfilter (New textlinecodecfactory (charset. forname ("UTF-8"); connector. getfilterchain (). addlast ("codec", new protocolcodecfilter (New cmccsipccodecfactory (charset. forname ("UTF-8"); connector. connect (New inetsocketaddress ("127.0.0.1", 9123 ));}}

Package COM. cemso. mina. client; import Org. apache. mina. core. service. iohandleradapter; import Org. apache. mina. core. session. iosession; import COM. cemso. mina. dto. smsobject;/*** @ author gl65293 ***/public class clientsessionhandler extends iohandleradapter {private final string values; Public clientsessionhandler (string values) {This. values = values;} public void sessionopened (iosession session) {// Sessi On. Write (values); smsobject SMS = new smsobject (); SMS. setsender ("18817261072"); SMS. setreceiver ("15951892458"); SMS. setmessage ("Hello! Hello world! "); Session. Write (SMS );}}

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.