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:");
    }
}
时间: 2024-07-31 14:31:11

Mina使用总结(四)传输对象ObjectSerializationCodecFactory的相关文章

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

由来:在jsp开发中,会频繁使用到一些对象 .例如HttpSession,ServletContext,ServletContext,HttpServletRequet.所以Sun公司设计Jsp时,在jsp页面加载完毕之后就会自动帮开发者创建好这些对象,开发者只需要直接使用这些对象调用方法即可!这些创建好的对象就叫内置对象,一共有九个. 内置对象名 类型 request HttpServletRequest  response  HttpServletResponse config Servle

巧用Android网络通信技术,在网络上直接传输对象

本文首发于CSDN博客,转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8967080 要做一个优秀的Android应用,使用到网络通信技术是必不可少的,很难想象一款没有网络交互的软件最终能发展得多成功.那么我们来看一下,一般Android应用程序里都是怎么实现网络交互的,这里拿一个Boook对象为例: 如上图所示,首先在手机端生成一个Book对象,里面包含书名.作者.价格等数据.为了要将这些数据发送到服务器端,我们要从Book对

初探swift语言的学习笔记四(类对象,函数)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! swift扩展了非常多功能和属性,有些也比較奇P.仅仅有慢慢学习,通过经验慢慢总结了. 以下将初步学习一下类的写法. 码工,最大爱好就是看码,而不是文字,太枯燥. // // computer.swift // swiftDemo // // C

Netty 4 传输对象

对于Netty在这里就不做过多介绍了,详情咨询http://netty.io/wiki/user-guide-for-4.x.html 我们在使用netty的过程中肯定会遇到传输对象的情况,Netty4通过ObjectEncoder和ObjectDecoder来支持. 首先我们定义一个User对象,一定要实现Serializable接口: import java.io.Serializable; /** * User: hupeng * Date: 14-6-3 * Time: 上午1:31 *

C++ Primer 学习笔记_23_类与数据抽象(9)--四种对象生存期和作用域、static 用法总结

C++ Primer 学习笔记_23_类与数据抽象(9)--四种对象生存期和作用域.static 用法总结 前言: 从上图可知,程序占用的内存被分了以下几部分. (1).栈区(stack) 存放函数的参数值,局部变量的值等,内存的分配是连续的.栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁,其特点是效率高,但空间大小有限 注意:通常栈空间容量比较小,一般是1MB-2MB,所以体积比较大的对象不适合在栈中分配. (2).堆区(heap) 由malloc系列函数或new操作符

Effective C++ 条款四 确定对象被使用前已被初始化

1.对于某些array不保证其内容被初始化,而vector(来自STL)却有此保证. 2.永远在使用对象前初始化.对于无任何成员的内置类型,必须手工完成.      int x = 0;      const int * p = &x; 3.不要混淆赋值与初始化的区别.一般初始化在定义的时候一起进行.而赋值是在定义之后的动作.      比如说在某一个类中的构造函数中,函数的行为都是赋值操作,而非初始化操作.      一般来说,对象的成员变量的初始化动作发生在进入构造函数本体之前.所以,我们一

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

JDK序列化不需要额外的类库,只需要实现Serializable即可,但是序列化之后的码流只有Java才能反序列化,所以它不是跨语言的,另外由于Java序列化后码流比较大,效率也不高,所以在RPC中很少使用,本文只是做学习之用. 编解码器: public class JdkDecoder extends MessageToMessageDecoder<ByteBuf> { @Override protected void decode(ChannelHandlerContext channel

四、对象如何创建,布局?如何访问数据

四.对象如何创建,布局?如何访问数据 对象的内存分配 对象的创建过程 Jvm读到new指令, 先去方法区(类常量池中)查看是否有对应的类符号,并检查该类是否被加载, if 加载,JVM为新生对象分配内存 else 加载类,为对象分配内存 内存分配完,JVM将内存空间值初始化为0值 对象头信息记录,这个对象是哪个类的实例,如何找到类元数据信息,对象哈希码值,对象的GC分代信息记录到对象头中: new之后执行init操作 JVM内存分配的方式 指针碰撞Bump the pointer分配内存 如果堆

mina传输对象

接触java的Mina框架已经有很多时间了,在网上也读过了很多的相关文章,发现Mina框架的确是一个值得拿来好好研究的东西,前些日子写了一个山寨QQ项目,其中的通信部分用到了java中自带的InputStream,OutputStream,Writer,Reader等等,感觉其中的很大的一个问题就是难以将事务处理的逻辑层与解析层分离开来,造成整个项目看起来比较臃肿,繁琐,不够模块化,接触Mina后发现mina在这方面做的很是恰到好处. 看到文章标题,你或许会有一些疑惑: 1.Mina框架传递对象