Mina使用总结(四)传输对象ObjectSerializationCodecFactory
2024-10-15 06:06:20
用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:");
}
}
最新文章
- Discuz论坛安全加固浅析
- log4j日志-liu
- 【转载】javaAgent 参数
- 在CentOS上安装Git
- C#遍历List并删除某个或者几个元素的方法
- hdu5314 Happy King
- 你真的会使用SQL Server的备份还原功能吗?之一:恢复模型
- ANDROID 中UID与PID的作用与区别
- Soft Drinking(水)
- css为网页顶部和底部都加入背景图
- python开发环境安装
- Multidimensional Array And an Array of Arrays
- od的用法
- 接口测试入门(2)--get和post初级请求/使用httpclient做一个获取信息list的请求(需要登录才可以)
- 如何配置jenkins 与代理服务器吗?
- springboot整合Quartz实现定时任务
- Sql server—— for xml path简单用法(可以按照分组把相同组的列中的不同的值,像字符串一样拼接在一起显示在分组之后的列中。)
- tcpkill,干掉tcp连接
- Docz 用 MDX 写 React UI 组件文档
- 详解.NET IL代码(一)
热门文章
- [转]Configure Network Drive Visible for SQL Server During Backup and Restore Using SSMS
- jquery 关于使用 append 追加 元素后 事件无法触发
- Mysql explain分析sql语句执行效率
- 【java基础】从反射开始(Reflection)
- 最简单的socket通信
- Wampserver环境配置
- 【代码笔记】iOS-JASidePanelsDemo(侧滑)
- Vue2.0项目打包后只能访问首页,其他页面路径错误找不到
- css雪碧技术的用法。
- BlockingQueue介绍及使用