首页 > 代码库 > Mina传递对象

Mina传递对象

利用Apache MINA来传递对象,这对了MINA来说非常容易,并且这也是Java网络编程中很常用的应用。 

首先看两个用来传递的Java对象MyRequestObject和MyResponseObject,很简单只是实现了Serializable接口罢了。

MyRequestObject.java

package demo5.vo;import java.io.Serializable;public class MyRequestObject implements Serializable {    private static final long serialVersionUID = 1L;    private String name;        private String value;    public MyRequestObject(String name, String value) {        this.name = name;        this.value =http://www.mamicode.com/ value;    }        public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getValue() {        return value;    }    public void setValue(String value) {        this.value =http://www.mamicode.com/ value;    }        @Override    public String toString() {        StringBuffer sb = new StringBuffer();        sb.append("Request [name: " + name  + ", value: " + value + "]");        return sb.toString();    }}

MyResponseObject.java

package demo5.vo;import java.io.Serializable;public class MyResponseObject implements Serializable {    private static final long serialVersionUID = 1L;    private String name;        private String value;    public MyResponseObject(String name, String value) {        this.name = name;        this.value =http://www.mamicode.com/ value;    }        public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getValue() {        return value;    }    public void setValue(String value) {        this.value =http://www.mamicode.com/ value;    }        @Override    public String toString() {        StringBuffer sb = new StringBuffer();        sb.append("Response [name: " + name  + ", value: " + value + "]");        return sb.toString();    }}

Server端的代码

MyServer.java

package demo5.server;import java.io.IOException;import java.net.InetSocketAddress;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.serialization.ObjectSerializationCodecFactory;import org.apache.mina.filter.logging.LoggingFilter;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class MyServer {        private static final Logger logger = LoggerFactory.getLogger(MyServer.class);            public static void main(String[] args) {        int bindPort = 10000;                IoAcceptor acceptor = new NioSocketAcceptor();                //调用IoSessionConfig设置读取数据的缓冲区大小、读写通道均在10秒内无任何操作就进入空闲状态        acceptor.getSessionConfig().setReadBufferSize(2048);        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);                acceptor.getFilterChain().addLast("logger", new LoggingFilter());        acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));        acceptor.setHandler(new MyServerHandler());                try {            acceptor.bind(new InetSocketAddress(bindPort));        } catch (IOException ex) {            logger.error(ex.getMessage(), ex);        }    }}

MyServerHandler.java

package demo5.server;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.core.session.IoSession;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import demo5.vo.MyRequestObject;import demo5.vo.MyResponseObject;public class MyServerHandler extends IoHandlerAdapter{    private static final Logger logger = LoggerFactory.getLogger(MyServerHandler.class);        @Override    public void sessionCreated(IoSession session) throws Exception {        System.out.println("IP:"+session.getRemoteAddress().toString());    }        @Override    public void sessionOpened(IoSession session) throws Exception {    }    @Override    public void sessionClosed(IoSession session) throws Exception {        System.out.println("IP:"+session.getRemoteAddress().toString()+"断开连接");    }    @Override    public void sessionIdle(IoSession session, IdleStatus status) throws Exception {        System.out.println( "IDLE " + session.getIdleCount( status ));    }    @Override    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {        logger.error(cause.getMessage(), cause);        session.close(true);    }    @Override    public void messageReceived(IoSession session, Object message) throws Exception {        logger.info("Received " + message);        MyRequestObject myReqOjb = (MyRequestObject) message;        MyResponseObject myResObj = new MyResponseObject(myReqOjb.getName(), myReqOjb.getValue());        session.write(myResObj);    }    @Override    public void messageSent(IoSession session, Object message) throws Exception {        logger.info("Sent " + message);    }}

Client端代码:

MyClient.java

package demo5.client;import java.net.InetSocketAddress;import org.apache.mina.core.RuntimeIoException;import org.apache.mina.core.future.ConnectFuture;import org.apache.mina.core.service.IoConnector;import org.apache.mina.core.session.IoSession;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;import org.apache.mina.filter.logging.LoggingFilter;import org.apache.mina.transport.socket.nio.NioSocketConnector;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class MyClient {        private static final Logger logger = LoggerFactory.getLogger(MyClient.class);        public static void main(String[] args) {        int bindPort = 10000;        String ip="localhost";                IoConnector connector = new NioSocketConnector();        connector.setConnectTimeoutMillis(10 * 1000);                connector.getFilterChain().addLast("logger", new LoggingFilter());        connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));                connector.setHandler(new MyClientHandler());        IoSession session = null;        try {            ConnectFuture future = connector.connect(new InetSocketAddress(ip, bindPort));            future.awaitUninterruptibly();            session = future.getSession();        } catch (RuntimeIoException e) {            logger.error(e.getMessage(), e);        }        session.getCloseFuture().awaitUninterruptibly();        connector.dispose();    }}

MyClientHandler.java

package demo5.client;import org.apache.mina.core.service.IoHandlerAdapter;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.core.session.IoSession;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import demo5.vo.MyRequestObject;import demo5.vo.MyResponseObject;public class MyClientHandler extends IoHandlerAdapter{    private static final Logger logger = LoggerFactory.getLogger(MyClientHandler.class);        @Override    public void sessionCreated(IoSession session) throws Exception {    }    @Override    public void sessionOpened(IoSession session) throws Exception {        MyRequestObject myObj = new MyRequestObject("我的name", "我的value");        session.write(myObj);    }    @Override    public void sessionClosed(IoSession session) throws Exception {    }    @Override    public void sessionIdle(IoSession session, IdleStatus status) throws Exception {    }    @Override    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {        logger.error(cause.getMessage(), cause);        session.close(true);    }    @Override    public void messageReceived(IoSession session, Object message) throws Exception {        MyResponseObject myResObj = (MyResponseObject) message;        logger.info("Received " + myResObj);        session.close(true);    }    @Override    public void messageSent(IoSession session, Object message) throws Exception {        logger.info("Sent " + message);    }}

 

Mina传递对象