Mina使用总结(四)传输对象ObjectSerializationCodecFactory

时间:2023-08-06 13:18:08

用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("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
acceptor.getFilterChain().addLast("threadPool",new ExecutorFilter(Executors.newCachedThreadPool()));
//设置读缓冲
acceptor.getSessionConfig().setReadBufferSize(2048*2048);
//设置心跳频率
acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 30);
//设置Handler
acceptor.setHandler(new ObjectHandler());
try {
Set<SocketAddress> addresses = new HashSet<SocketAddress>();
//此处的host地址需注意,需要填写主机对外的ip地址或域名,不可用localhost
addresses.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 { @Override
public void sessionCreated(IoSession session) {
//session创建时回调
System.out.println("Session Created!");
} @Override
public void sessionClosed(IoSession session) throws Exception {
//session关闭时回调
System.out.println("Session Closed!");
} @Override
public void sessionOpened(IoSession session) throws Exception {
//session打开时回调
System.out.println("Session Opened!");
} @Override
public void sessionIdle(IoSession session, IdleStatus status) {
//心跳
System.out.println("sessionIdle");
} @Override
public void exceptionCaught(IoSession session, Throwable cause) {
//异常时回调
cause.printStackTrace();
//关闭session
session.close(true);
} @Override
public 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("codec",
new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
//设置日志过滤器
connector.getFilterChain().addLast("logger", new LoggingFilter());
//设置Handler
connector.setHandler(new MyClientHandler()); //获取连接,该方法为异步执行
ConnectFuture future = connector.connect(new InetSocketAddress(
HOSTNAME, PORT));
//等待连接建立
future.awaitUninterruptibly();
//获取session
IoSession 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 { @Override
public void sessionCreated(IoSession session) throws Exception {
//session 创建时调用
TransInfo info = new TransInfo();
session.write(info);
} @Override
public void messageReceived(IoSession session, Object message)
throws Exception {
//异步接收消息
TransInfo info = (TransInfo) message;
session.close(true);
} @Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
//出现异常
cause.printStackTrace();
session.close(true);
} @Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
//心跳
System.out.println("客户端ide:");
}
}