用mina框架传输对象,对于开发者来说,直接传输对象,而不用自己编写相应的报文转换代码,将大大节省
开发时间。
即使用对象编码解码器
使用ObjectSerializationCodecFactory
服务端
MinaServer.java代码如下
package com.bypay.mina.server;import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.HashSet; import java.util.Set; import java.util.concurrent.Executors; 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.executor.ExecutorFilter; import org.apache.mina.filter.logging.LoggingFilter; import org.apache.mina.transport.socket.nio.NioSocketAcceptor;import com.bypay.mina.server.handle.ObjectHandler;public class MinaServer {private IoAcceptor acceptor ;public MinaServer() {acceptor = new NioSocketAcceptor();//设置日志过滤器acceptor.getFilterChain().addLast("logger", new LoggingFilter());acceptor.getFilterChain().addLast("threadPool",new ExecutorFilter(Executors.newCachedThreadPool()));//设置读缓冲acceptor.getSessionConfig().setReadBufferSize(2048*2048);//设置心跳频率acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 30);//设置Handleracceptor.setHandler(new ObjectHandler());try {Set<SocketAddress> addresses = new HashSet<SocketAddress>();//此处的host地址需注意,需要填写主机对外的ip地址或域名,不可用localhostaddresses.add(new InetSocketAddress("localhost", 18886));acceptor.bind(addresses);} catch (IOException ioe) {ioe.printStackTrace();}System.out.println("--------------------------------------------------");System.out.println("Server Started");System.out.println("--------------------------------------------------");}public static void main(String[] args) {MinaServer server = new MinaServer();} }
ObjectHandler.java
package com.bypay.mina.server.handle;import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; import com.bypay.mina.bean.TransInfo;public class ObjectHandler extends IoHandlerAdapter {@Overridepublic void sessionCreated(IoSession session) {//session创建时回调System.out.println("Session Created!");}@Overridepublic void sessionClosed(IoSession session) throws Exception { //session关闭时回调System.out.println("Session Closed!");}@Overridepublic void sessionOpened(IoSession session) throws Exception {//session打开时回调System.out.println("Session Opened!");}@Overridepublic void sessionIdle(IoSession session, IdleStatus status) {//心跳System.out.println("sessionIdle");}@Overridepublic void exceptionCaught(IoSession session, Throwable cause) {//异常时回调 cause.printStackTrace();//关闭sessionsession.close(true);}@Overridepublic void messageReceived(IoSession session, Object message)throws Exception {//接收消息
//TransInfo为自定义对象TransInfo info = (TransInfo) message; //System.out.println("接收返回消息成功"); //System.out.println("id:"+info.getId()); //System.out.println("msg:"+info.getMsg());//Thread.sleep(100); session.write(info);//session.close(true); } }
TransInfo.java
传输的自定义对象必须实现Serializable接口,且客户端和服务端的包名+类名必须要保持一致
package com.bypay.mina.bean;public class TransInfo implements java.io.Serializable{/*** */private static final long serialVersionUID = 1L;private long id;private String msg;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}}
客户端
客户端必须也要设置同样的编码和解码工厂ObjectSerializationCodecFactory
如MinaClient.java
package com.bypay.mina.client;import java.net.InetSocketAddress; import org.apache.mina.core.future.ConnectFuture; 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 com.bypay.mina.handler.MyClientHandler;/*** Mina客户端* @author 唐延波* @date 2015-1-20**/ public class MinaClient {private static int CONNECT_TIMEOUT = 1000;private static String HOSTNAME = "localhost";private static int PORT = 18886;/*** @author 唐延波* @throws InterruptedException* @date 2014-11-4*/public static void main(String[] args) throws InterruptedException {NioSocketConnector connector = new NioSocketConnector();connector.setConnectTimeoutMillis(CONNECT_TIMEOUT);//设置读缓冲,传输的内容必须小于此缓冲connector.getSessionConfig().setReadBufferSize(2048*2048);//设置编码解码器//设置日志过滤器connector.getFilterChain().addLast("logger", new LoggingFilter());//设置Handlerconnector.setHandler(new MyClientHandler());//获取连接,该方法为异步执行ConnectFuture future = connector.connect(new InetSocketAddress(HOSTNAME, PORT));//等待连接建立 future.awaitUninterruptibly();//获取sessionIoSession session = future.getSession();//等待session关闭 session.getCloseFuture().awaitUninterruptibly();//释放connector connector.dispose();} }
MyClientHandler.java
package com.bypay.mina.handler;import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession;import com.bypay.mina.bean.TransInfo;/*** ClientHandler* @author 唐延波* @date 2015-1-20**/ public class MyClientHandler extends IoHandlerAdapter {@Overridepublic void sessionCreated(IoSession session) throws Exception {//session 创建时调用TransInfo info = new TransInfo();session.write(info);}@Overridepublic void messageReceived(IoSession session, Object message)throws Exception {//异步接收消息TransInfo info = (TransInfo) message;session.close(true);}@Overridepublic void exceptionCaught(IoSession session, Throwable cause)throws Exception {//出现异常 cause.printStackTrace();session.close(true);}@Overridepublic void sessionIdle(IoSession session, IdleStatus status)throws Exception {//心跳System.out.println("客户端ide:");} }