用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. 自己实现一个双向绑定的Vue

    我们知道双向绑定是Vue的核心之一,接下来我们自己仿照Vue实现一个基本的功能. 项目代码在GitHub上: https://github.com/zhangKunUserGit/zk-vue

  2. 能ping通外网dns但不能上网一例

    一个win7本本仅通过一个无线路由一个人上网,突然一天不能上网了,甚是奇怪,一看本地连接均是正常的.而且能ping通外网的dns,但无论如何就是打不开网页,表现为输入任何网址很迅速的显示该页无法显示, ...

  3. C# 中的委托和事件 --转载

    作者:张子阳 转载源:  http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx C# 中的委托 ...

  4. commons-fileupload-1.4使用及问题

    文件上传 使用commons-fileupload-1.4控件及依赖的commons-io-2.6控件 jsp页面中内容 <form action="../servlet/FileUp ...

  5. python多线程之threading模块

    threading模块中的对象 其中除了Thread对象以外,还有许多跟同步相关的对象 threading模块支持守护线程的机制 Thread对象 直接调用法 import threading imp ...

  6. Vue2入门路线及资源

    前言:最近在学习Vue,感觉对vue+vuex+vue-router算是小小地入门了.想起前期最苦恼也是最费时的事,就是在每个阶段找到合适当前水平的资源或者demo,所以本文我根据我自己的体验,整理了 ...

  7. angular2 如何使用websocket

    1.npm下载: npm install angular2-websocket 2.需要在哪个组件使用就在那里引入: import {$WebSocket} from 'angular2-websoc ...

  8. 网络I/O模型--04非阻塞模式(解除accept()、 read()方法阻塞)的基础上加入多线程技术

    由于应用程序级别并没有使用多线程技术,这就导致了应用程序只能一个一个地对Socket 套接字进行处理.这个 Socket 套接宇没有处理完,就没法处理下一个 Socket 套接字 .针对这个 问题还是 ...

  9. 进度条(Progressbar)

    进度条(Progressbar) 提供如下一些样式改变进度条的外观 @android:style/Widget.ProgressBar.Horizontal(水平进度条) @android:style ...

  10. Flutter隐藏控件方法

    new Offstage( offstage: true, //这里控制 child: Container(color: Colors.blue,height: 100.0,), ),