用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的更多相关文章

  1. Jsp(3):内置对象和四种域对象的理解

    由来:在jsp开发中,会频繁使用到一些对象 .例如HttpSession,ServletContext,ServletContext,HttpServletRequet.所以Sun公司设计Jsp时,在 ...

  2. 从零开始学C++之对象的使用(二):四种对象生存期和作用域、static 用法总结

    一.四种对象生存期和作用域 栈对象 隐含调用构造函数(程序中没有显式调用) 堆对象 隐含调用构造函数(程序中没有显式调用),要显式释放 全局对象.静态全局对象 全局对象的构造先于main函数 已初始化 ...

  3. Feign get接口传输对象引发一场追寻

    一个报错引发的追寻之路: Feign get接口传输对象,调用方接口代码: @FeignClient(name = "manage") public interface Acces ...

  4. 四种对象生存期和作用域、static 用法总结

    一.四种对象生存期和作用域 栈对象 隐含调用构造函数(程序中没有显式调用) 堆对象 隐含调用构造函数(程序中没有显式调用),要显式释放 全局对象.静态全局对象 全局对象的构造先于main函数 已初始化 ...

  5. Netty--JDK序列化编解码传输对象

    使用JDK序列化不需要额外的类库,只需要实现Serializable即可,但是序列化之后的码流只有Java才能反序列化,所以它不是跨语言的,另外由于Java序列化后码流比较大,效率也不高,所以在RPC ...

  6. 深入了解java虚拟机(JVM) 第四章 对象的创建

    一.对象的创建过程 对象的创建过程大致可以分为六步,其中对象的分配尤为重要: 二.对象分配内存 一般来说对象分配内存有两种方式: 第一种是指针碰撞,这是一种比较理想的方式:如果Java堆是绝对规整的: ...

  7. ActiveMQ服务器之间传输对象,项目A发送对象到项目B接收发送对象《二》

    ActiveMQ服务器之间传输对象,项目A发送对象到项目B接收发送对象<一> 上一篇文章写到对象之间传输使用线程方式 ,无法使用监听方式,最近解决了使用监听方式接收对象,本次使用配置文件方 ...

  8. 自制Java虚拟机(四)-对象、new、invokespecial

    自制Java虚拟机(四)-对象.new.invokespecial 一.对象的表示 刚开始学Java的时候,图书馆各种教程,书名往往都是“Java面向对象高级编程”,通常作者都会与C++做个比较,列出 ...

  9. Java Socket实战之三:传输对象

    转自:https://i.cnblogs.com/EditPosts.aspx?opt=1 前面两篇文章介绍了怎样建立Java Socket通信,这一篇说一下怎样使用Java Socket来传输对象. ...

随机推荐

  1. Linux 目录流管理

    目录 1. 打开/关闭文件 1). 打开目录 / opendir 2). 关闭文件 / fclose 2. 读/写目录流 1). 目录流-读 / readdir & readdir_r 3. ...

  2. [转]Configure Network Drive Visible for SQL Server During Backup and Restore Using SSMS

    本文转自:https://mytechmantra.com/LearnSQLServer/Configure-Network-Drive-Visible-for-SQL-Server-During-B ...

  3. Ionic APP 热更新 之 产品发布状态下的热更新搭建,去local-dev-addon插件

    上一篇,我们介绍了在本地开发环境下的ionic项目热更新测试, 本文,我们将详细说明如何在去掉cordova-hot-code-push-local-dev-addon插件的情况下,实现热更新. 使用 ...

  4. WCF中的异常

       一.考虑到安全因素,为了避免将服务端的异常发送给客户端.默认情况下,服务端出现异常会对异常屏蔽处理后,再发送到客户端.所以客户端捕捉到的异常都是同一个FaultException异常. 例如在服 ...

  5. ArchLinux - 安装指南

    Step 1 将镜像写入u盘 u盘从来不是唯一的选择,但多数人可能喜欢这么做. 我是在OS X上进行操作,如果你用的是windows,也许可以使用Image Writer for Windows或者U ...

  6. Java中使用json时java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher问题解决

    下面代码: public static void main(String[] args) { JSONObject obj = new JSONObject(); obj.put("msg& ...

  7. Xcode DEBUG宏定义,debug和release模式的选择

    设置DEBUG, 使用宏定义: #if DEBUG NSLog(@"debug model"); #else //执行release模式的代码 #endif

  8. 从mysql中dump数据到本地

    方法一:使用mysqldump命令,如: mysqldump -h10.90.6.237 -uf_insplat2car_r -P3306 -pxxxxxxxxx nbmp tb_tag_log -- ...

  9. JAVA基础之——三大特征、接口和抽象类区别、重载和重写区别、==和equals区别、JAVA自动装箱和拆箱

    1 java三大特征 1)封装:即class,把一类实体定义成类,该类有变量和方法. 2)继承:从已有的父类中派生出子类,子类实现父类的抽象方法. 3)多态:通过父类对象可以引用不同的子类,从而实现不 ...

  10. Java数据结构基础知识你知道多少?

    http://www.cnblogs.com/qlky/p/7359462.html http://www.importnew.com/28263.html HashMap( java 7) 构造函数 ...