springcloud与mina完美结合
来源:互联网 发布:黑暗之魂3世界观知乎 编辑:程序博客网 时间:2024/06/01 08:30
Mina 开发高性能和高可用性的网络应用程序的通讯框架。
Mina 特点:
1.基于Java NIO类库
2.非阻塞方式的异步传输
3.与spring完美结合
4.依赖apache
5.灵活的配置过滤器
6.....
Mina 流程:
------------------------------------------->
IoHandler(负责接收和处理数据)
-------> IoFilter(一系列灵活可控的过滤器,例如 日志过滤器,编码过滤器)
-------> IoAcceptor
-------> IoService(建立套接字,监听)
------------------------------------------->
Mina 实战:
package cn.xyd.job.gateway.mina;import java.net.InetSocketAddress;import java.nio.charset.Charset;import org.apache.log4j.Logger;import org.apache.mina.core.service.IoAcceptor;import org.apache.mina.core.service.IoHandler;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.textline.TextLineCodecFactory;import org.apache.mina.filter.logging.LoggingFilter;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class MinaConfig { private Logger log = Logger.getLogger(MinaConfig.class); private final int SOCKET_PORT = 9999; @Bean public LoggingFilter loggingFilter() { return new LoggingFilter(); } @Bean public IoHandler ioHandler() { return new SocketServerHandler(); } @Bean public InetSocketAddress inetSocketAddress() { return new InetSocketAddress(SOCKET_PORT); } @Bean public IoAcceptor ioAcceptor() throws Exception { log.info("正在启动socket服务端。。。。"); //监听传入 连接的对象 IoAcceptor acceptor=new NioSocketAcceptor(); //记录所有的信息,比如创建session(会话),接收消息,发送消息,关闭会话等 acceptor.getFilterChain().addLast( "logger", loggingFilter() ); //ProtocolCodecFilter(协议编解码过滤器).这个过滤器用来转换二进制或协议的专用数据到消息对象中 acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory(Charset.forName("UTF-8")))); //创建一个handler来实时处理客户端的连接和请求,这个handler 类必须实现 IoHandler这个接口。 acceptor.setHandler(ioHandler()); //设置读写缓冲区大小 acceptor.getSessionConfig().setReadBufferSize( 2048 ); //空闲时间 通道均在10 秒内无任何操作就进入空闲状态 acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 ); acceptor.bind(inetSocketAddress()); log.info("socket 服务端 已经启动。。。。"); return acceptor; } }
package cn.ccb.xyd.job.gateway.mina;import java.net.InetSocketAddress;import org.apache.mina.core.service.IoHandler;import org.apache.mina.core.session.IdleStatus;import org.apache.mina.core.session.IoSession;import org.apache.mina.transport.socket.SocketSessionConfig;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import cn.ccb.xyd.job.common.common.ErrorCode;import cn.ccb.xyd.job.common.exception.BizException;import cn.ccb.xyd.job.gateway.core.InvokeService;//import com.example.zuul.Application;//import com.example.zuul.core.InvokeService;public class SocketServerHandler implements IoHandler { private static Logger log = LoggerFactory.getLogger(SocketServerHandler.class); @Autowired private InvokeService invokeService; @Override public void sessionCreated(IoSession session) throws Exception { //在socket连接时,获取客户端的iP String clientIP = ((InetSocketAddress)session.getRemoteAddress()).getAddress().getHostAddress(); //session.setAttribute("KEY_SESSION_CLIENT_IP", clientIP); log.info("session创建,客户端 IP: " + clientIP); //SocketSessionConfig cfg = (SocketSessionConfig) session.getConfig(); //mina在请求后直接 调用close();不会再进入TIME_WAIT状态,而是直接close(); // cfg.setSoLinger(0); } @Override public void sessionOpened(IoSession session) throws Exception { // TODO Auto-generated method stub } @Override public void sessionClosed(IoSession session) throws Exception { // TODO Auto-generated method stub } //空闲状态时,将定时调用一次会话 @Override public void sessionIdle(IoSession session, IdleStatus status) throws Exception { // TODO Auto-generated method stub } //exceptionCaught 应该总是在handler 中定义,来处理一些异常情况,否则异常信息将无法捕捉。 //exceptionCaught 方法简单地打印了错误的堆栈跟踪和关闭会话。 //对于大多数程序,这将是标准的做法,除非处理程序可以从异常状态中恢复。 @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { log.info(cause.getMessage()); session.close(); } //messageReceived 方法来处理从客户端接收到的数据 // 根据所使用的协议编解码器,object 这个参数传递的类型有所不同,以及返回的数据时的session.write(Object) 也不同。 // 如果不指定协议的编解码器,你将收到一个类型为IoBuffer 的对象,返回的数据也要求是IoBuffer。 @Override public void messageReceived(IoSession session, Object message) throws Exception { String msg = message.toString(); if("quit".equals(msg)){ session.close(); } log.info("socket server接收报文:{}", msg); String retMsg = null; log.info("invokeService"+invokeService); try { retMsg = invokeService.request("sendMessage?msg="+msg,String.class); } catch (Exception e) { new BizException(ErrorCode.ERROR_002); retMsg = ErrorCode.ERROR_002; } log.info("socket server返回报文:{}", retMsg); session.write(retMsg); } @Override public void messageSent(IoSession session, Object message) throws Exception { // TODO Auto-generated method stub }}
<!-- mina配置 --><dependency><groupId>org.apache.mina</groupId><artifactId>mina-core</artifactId><version>2.0.4</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-nop</artifactId><version>1.6.1</version></dependency><!-- END -->
Ps:iosession阔以深入研究下,我就不研究了。。。懒
1 0
- springcloud与mina完美结合
- 信息系统与管理完美结合
- Paperwhite与OneNote完美结合
- VB.NET与C#的完美结合
- VB.NET与C#的完美结合
- VB.NET与C#的完美结合
- vb.net与FLASH的完美结合
- Arm与Linux的完美结合
- 转:Struts与Hibernate的完美结合
- Silverlight与ASP.NET的完美结合
- jquery, json与ashx的完美结合
- vb.net与FLASH的完美结合
- Flash与游戏的完美结合
- Tagbrand:签到与电子商务的完美结合
- python与shell的完美结合
- websocket与node.js的完美结合
- Watir与XPath的完美结合
- 博彩业与比特币完美结合
- 对象的拷贝 - $.extend方法
- IOS 添加下拉刷新
- 利用cookie实现iframe刷新时停留在当前页面
- java报错:The reference to entity "characterEncoding" must end with the ';' delimiter.
- 我的“创客”朦胧开篇章
- springcloud与mina完美结合
- 每天一个 Linux 命令(4):mkdir命令------学习笔记
- Java - 工具类
- TCP网络程序
- Android Fragement 界面碎片
- Java NIO
- Android编程权威指南(第二版)学习笔记(二十五)—— 第25章 搜索
- ES7 decorator helloworld
- CART算法