Mina使用总结(四)传输对象ObjectSerializationCodecFactory
用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:");
}
}
Mina使用总结(四)传输对象ObjectSerializationCodecFactory的更多相关文章
- Jsp(3):内置对象和四种域对象的理解
由来:在jsp开发中,会频繁使用到一些对象 .例如HttpSession,ServletContext,ServletContext,HttpServletRequet.所以Sun公司设计Jsp时,在 ...
- 从零开始学C++之对象的使用(二):四种对象生存期和作用域、static 用法总结
一.四种对象生存期和作用域 栈对象 隐含调用构造函数(程序中没有显式调用) 堆对象 隐含调用构造函数(程序中没有显式调用),要显式释放 全局对象.静态全局对象 全局对象的构造先于main函数 已初始化 ...
- Feign get接口传输对象引发一场追寻
一个报错引发的追寻之路: Feign get接口传输对象,调用方接口代码: @FeignClient(name = "manage") public interface Acces ...
- 四种对象生存期和作用域、static 用法总结
一.四种对象生存期和作用域 栈对象 隐含调用构造函数(程序中没有显式调用) 堆对象 隐含调用构造函数(程序中没有显式调用),要显式释放 全局对象.静态全局对象 全局对象的构造先于main函数 已初始化 ...
- Netty--JDK序列化编解码传输对象
使用JDK序列化不需要额外的类库,只需要实现Serializable即可,但是序列化之后的码流只有Java才能反序列化,所以它不是跨语言的,另外由于Java序列化后码流比较大,效率也不高,所以在RPC ...
- 深入了解java虚拟机(JVM) 第四章 对象的创建
一.对象的创建过程 对象的创建过程大致可以分为六步,其中对象的分配尤为重要: 二.对象分配内存 一般来说对象分配内存有两种方式: 第一种是指针碰撞,这是一种比较理想的方式:如果Java堆是绝对规整的: ...
- ActiveMQ服务器之间传输对象,项目A发送对象到项目B接收发送对象《二》
ActiveMQ服务器之间传输对象,项目A发送对象到项目B接收发送对象<一> 上一篇文章写到对象之间传输使用线程方式 ,无法使用监听方式,最近解决了使用监听方式接收对象,本次使用配置文件方 ...
- 自制Java虚拟机(四)-对象、new、invokespecial
自制Java虚拟机(四)-对象.new.invokespecial 一.对象的表示 刚开始学Java的时候,图书馆各种教程,书名往往都是“Java面向对象高级编程”,通常作者都会与C++做个比较,列出 ...
- Java Socket实战之三:传输对象
转自:https://i.cnblogs.com/EditPosts.aspx?opt=1 前面两篇文章介绍了怎样建立Java Socket通信,这一篇说一下怎样使用Java Socket来传输对象. ...
随机推荐
- hadoop学习笔记(五):HDFS Shell命令
一.HDFS文件命令 以下是比较重要的一些命令: [root@master01 hadoop]# hadoop fs -ls / //查看根目录下的所有文件 [root@master01 hadoop ...
- springboots 环境搭建
1.创建demo文件 spring initializr : http://start.spring.io/ 2.gradle 下载 https://services.gradle.org/distr ...
- 从Object对象中读取属性的值
C#是强类型语言,强到多变态?一个对象没有定义某个属性,你想点出来,IDE直接给你报语法错误.远不如js那么自由,想怎么点怎么点. 如果你从别人接口中拿到的就是Object类型,你想获取某个属性的值怎 ...
- MySQL填坑系列--Linux平台下MySQL区分大小写问题
大家好,我是软件大盗(道),下面开始我们的<MySQL填坑系列>. 笔者最近又在MySQL的边缘试探,然后,试探着,试探着就报错了. 书接上文,系统连接数据库时报错:找不到DB_TIMIN ...
- java 二分法
源码 public class Dichotomy { public static void main(String[] args){ int[] array = new int[12]; for(i ...
- Javascript实现图片翻转
使用Js的对象属性能实现简单的翻转效果.通过onMouseover事件和onMouseOut事件就能实现鼠标移到链接上和移开链接发生反应.给两个图片加上链接实现都能翻转的效果. reverse.htm ...
- C#跨窗体传值
果然C#的跨窗体传值比vb难得多,vb就定义一个全局变量就ok,但是C#还要考虑到命名空间的问题 frmMain要调用LoginUI的两个值,但是在此同时,frmMain又要引用LoginUI,所以说 ...
- javascript面向对象的常见写法与优缺点
我们通过表单验证的功能,来逐步演进面向对象的方式. 对于刚刚接触javascript的朋友来说,如果要写一个验证用户名,密码,邮箱的功能, 一般可能会这么写: //表单验证 var checkUs ...
- LeetCode CombinationSum II
class Solution { public: vector<vector<int> > combinationSum2(vector<int> &num ...
- Collection FrameWork
Collection FrameWork如下: Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashta ...