- 浏览: 981287 次
文章分类
- 全部博客 (428)
- Hadoop (2)
- HBase (1)
- ELK (1)
- ActiveMQ (13)
- Kafka (5)
- Redis (14)
- Dubbo (1)
- Memcached (5)
- Netty (56)
- Mina (34)
- NIO (51)
- JUC (53)
- Spring (13)
- Mybatis (17)
- MySQL (21)
- JDBC (12)
- C3P0 (5)
- Tomcat (13)
- SLF4J-log4j (9)
- P6Spy (4)
- Quartz (12)
- Zabbix (7)
- JAVA (9)
- Linux (15)
- HTML (9)
- Lucene (0)
- JS (2)
- WebService (1)
- Maven (4)
- Oracle&MSSQL (14)
- iText (11)
- Development Tools (8)
- UTILS (4)
- LIFE (8)
最新评论
-
Donald_Draper:
Donald_Draper 写道刘落落cici 写道能给我发一 ...
DatagramChannelImpl 解析三(多播) -
Donald_Draper:
刘落落cici 写道能给我发一份这个类的源码吗Datagram ...
DatagramChannelImpl 解析三(多播) -
lyfyouyun:
请问楼主,执行消息发送的时候,报错:Transport sch ...
ActiveMQ连接工厂、连接详解 -
ezlhq:
关于 PollArrayWrapper 状态含义猜测:参考 S ...
WindowsSelectorImpl解析一(FdMap,PollArrayWrapper) -
flyfeifei66:
打算使用xmemcache作为memcache的客户端,由于x ...
Memcached分布式客户端(Xmemcached)
Mina 抽象Polling连接器(AbstractPollingIoConnector):http://donald-draper.iteye.com/blog/2378978
Mina 报文监听器NioDatagramAcceptor一(初始化,Io处理器):http://donald-draper.iteye.com/blog/2379152
Mina 报文监听器NioDatagramAcceptor二(发送会话消息据等):http://donald-draper.iteye.com/blog/2379228
引言:
前面两篇文章我们看了报文监听器/接收器NioDatagramAcceptor,先来回顾一下
报文监听器NioDatagramAcceptor,内部有一个注册队列registerQueue,用于存放地址绑定的请求,一个取消队列,用于存放地址解绑请求,一个Map-boundHandles,用于存放socket地址与报文通道映射映射关系,会话管理器sessionRecycler,监控连接Service的会话,如果会话过期,关闭过期的会话,一个通道选择器selector处理报文通道的读写操作事件,一个监听器线程acceptor,用于处理地址绑定和解绑,报文通道读写事件,发送会话消息及销毁监听器工作。报文监听器构造主要是初始化会话配置,IO事件执行器和打开选择器。报文监听器写操作,首先获取会话写请求队列,计算会话最大发送字节数,获取会话写请求buffer;如果写请求为空,则从请求队列poll一个写请求,然后获取写请求buffer及写请求目的socket地址,委托会话关联的报文通道发送数据;如果buffer数据太多或没有写成功,添加写请求到会话请求队列,关注写事件,否则取消关注写事件,置空会话当前写请求,触发会话发送事件。绑定地址,首先添加地址绑定请求到注册队列registerQueue,启动监听器线程acceptor,唤醒选择操作,然后等待地址绑定完成,最后返回报文通道绑定的socket地址集。
监听器线程Acceptor,首先执行超时选择操作;处理地址绑定请求,首先从注册队列poll地址绑定请求,遍历绑定请求地址集,根据绑定的socket地址打开一个报文通道,配置通道会话及阻塞模式,绑定socket地址,注册报文通道读操作事件OP_READ到选择器selector,添加socket地址与报文通道映射到boundHandles,通知service监听,服务已开启,触发fireServiceActivated事件; 如果没有报文通道处理,则清空注册队列和取消队列,置空监听器线程; 如果选择操作后,有报文通道的读写事件就绪,则遍历读写操作事件就绪的报文通道,如果是读事件,接受报文通道数据,如果远端地址不为空,创建会话,首先从boundHandles获取远端socket地址关联的报文通道,从会话管理器sessionRecycler,获取远端socket地址会话,以便重用,如果会话管理器中不存在,则根据Io处理器,报文通道及远端socket地址创建报文会话,设置会话选择key,将会话添加会话管理器,监控会话,初始化会话,构建会话过滤链,通知Service监听器发生会话创建事件fireSessionCreated;如果是写事件,则调度Service管理的会话,添加到刷新队列; 处理刷新队列,从刷新队列poll写请求会话,获取会话写请求队列,会话最大读buffer size,获取会话当前写请求,获取写请求消息,写请求远端地址,通过会话关联的报文通道发送会话消息字节序列,数据发送成功,置空会话当前写请求,触发会话过滤链消息发送事件fireMessageSent,否则设置会话重新关注写操作事件,如果刷新会话写请求成功,但会话写请求队列不为空,且未调度,则重新调度会话;处理解绑地址请求队列,首先从取消队列,poll地址解绑请求,遍历地址解绑请求socket地址集合,从socket与报文通道映射集boundHandles移除socket地址,关闭报文通道;通知service管理的会话空闲;如何Io处理器正在关闭,则销毁报文监听器。
今天我们来看一下报文连接器NioDatagramConnector,先看一下报文连接器接口的定义:
再来看报文连接器NioDatagramConnector
NioDatagramConnector上面结果构造方法与AbstractPollingIoConnector构造方法相似。
来看其他方法,这些方法很简单,一看就明白,不多讲。
总结:
由于报文连接器是面向无连接的,与选择器有关的操作要么不支持,要么空体,要么返回空集合;连接操作直接委托报文通道;绑定地址,首先打开一个报文通道,然后由报文通道关联的报文socket完成实际的地址绑定。
Mina 报文监听器NioDatagramAcceptor一(初始化,Io处理器):http://donald-draper.iteye.com/blog/2379152
Mina 报文监听器NioDatagramAcceptor二(发送会话消息据等):http://donald-draper.iteye.com/blog/2379228
引言:
前面两篇文章我们看了报文监听器/接收器NioDatagramAcceptor,先来回顾一下
报文监听器NioDatagramAcceptor,内部有一个注册队列registerQueue,用于存放地址绑定的请求,一个取消队列,用于存放地址解绑请求,一个Map-boundHandles,用于存放socket地址与报文通道映射映射关系,会话管理器sessionRecycler,监控连接Service的会话,如果会话过期,关闭过期的会话,一个通道选择器selector处理报文通道的读写操作事件,一个监听器线程acceptor,用于处理地址绑定和解绑,报文通道读写事件,发送会话消息及销毁监听器工作。报文监听器构造主要是初始化会话配置,IO事件执行器和打开选择器。报文监听器写操作,首先获取会话写请求队列,计算会话最大发送字节数,获取会话写请求buffer;如果写请求为空,则从请求队列poll一个写请求,然后获取写请求buffer及写请求目的socket地址,委托会话关联的报文通道发送数据;如果buffer数据太多或没有写成功,添加写请求到会话请求队列,关注写事件,否则取消关注写事件,置空会话当前写请求,触发会话发送事件。绑定地址,首先添加地址绑定请求到注册队列registerQueue,启动监听器线程acceptor,唤醒选择操作,然后等待地址绑定完成,最后返回报文通道绑定的socket地址集。
监听器线程Acceptor,首先执行超时选择操作;处理地址绑定请求,首先从注册队列poll地址绑定请求,遍历绑定请求地址集,根据绑定的socket地址打开一个报文通道,配置通道会话及阻塞模式,绑定socket地址,注册报文通道读操作事件OP_READ到选择器selector,添加socket地址与报文通道映射到boundHandles,通知service监听,服务已开启,触发fireServiceActivated事件; 如果没有报文通道处理,则清空注册队列和取消队列,置空监听器线程; 如果选择操作后,有报文通道的读写事件就绪,则遍历读写操作事件就绪的报文通道,如果是读事件,接受报文通道数据,如果远端地址不为空,创建会话,首先从boundHandles获取远端socket地址关联的报文通道,从会话管理器sessionRecycler,获取远端socket地址会话,以便重用,如果会话管理器中不存在,则根据Io处理器,报文通道及远端socket地址创建报文会话,设置会话选择key,将会话添加会话管理器,监控会话,初始化会话,构建会话过滤链,通知Service监听器发生会话创建事件fireSessionCreated;如果是写事件,则调度Service管理的会话,添加到刷新队列; 处理刷新队列,从刷新队列poll写请求会话,获取会话写请求队列,会话最大读buffer size,获取会话当前写请求,获取写请求消息,写请求远端地址,通过会话关联的报文通道发送会话消息字节序列,数据发送成功,置空会话当前写请求,触发会话过滤链消息发送事件fireMessageSent,否则设置会话重新关注写操作事件,如果刷新会话写请求成功,但会话写请求队列不为空,且未调度,则重新调度会话;处理解绑地址请求队列,首先从取消队列,poll地址解绑请求,遍历地址解绑请求socket地址集合,从socket与报文通道映射集boundHandles移除socket地址,关闭报文通道;通知service管理的会话空闲;如何Io处理器正在关闭,则销毁报文监听器。
今天我们来看一下报文连接器NioDatagramConnector,先看一下报文连接器接口的定义:
/** * {@link IoConnector} for datagram transport (UDP/IP). * * @author [url=http://mina.apache.org]Apache MINA Project[/url] */ public interface DatagramConnector extends IoConnector { /** * @return the default remote InetSocketAddress to connect to when no argument * is specified in {@link #connect()} method. 返回默认的远端socket地址 * This method overrides the {@link IoConnector#getDefaultRemoteAddress()} method. */ @Override InetSocketAddress getDefaultRemoteAddress(); /** * @return the default configuration of the new FatagramSessions created by * this connect service. 获取会话配置 */ @Override DatagramSessionConfig getSessionConfig(); /** * Sets the default remote InetSocketAddress to connect to when no argument is * specified in {@link #connect()} method. * This method overrides the {@link IoConnector#setDefaultRemoteAddress(java.net.SocketAddress)} method. * 设置默认远端socket地址 * @param remoteAddress The remote address to set */ void setDefaultRemoteAddress(InetSocketAddress remoteAddress); }
再来看报文连接器NioDatagramConnector
/** * {@link IoConnector} for datagram transport (UDP/IP). * * @author [url=http://mina.apache.org]Apache MINA Project[/url] */ public final class NioDatagramConnector extends AbstractPollingIoConnector<NioSession, DatagramChannel> implements DatagramConnector { /** * Creates a new instance. 创建一个报文连接器,默认会话配置,使用简单IO处理器线程池 */ public NioDatagramConnector() { super(new DefaultDatagramSessionConfig(), NioProcessor.class); } /** * Creates a new instance. * 与上面不同,限定了简单IO处理器线程池线程数量,即IO处理器实例数 * @param processorCount The number of IoProcessor instance to create */ public NioDatagramConnector(int processorCount) { super(new DefaultDatagramSessionConfig(), NioProcessor.class, processorCount); } /** * Creates a new instance. * 多service共享同一IO处理器实例 * @param processor The IoProcessor instance to use */ public NioDatagramConnector(IoProcessor<NioSession> processor) { super(new DefaultDatagramSessionConfig(), processor); } /** * Constructor for {@link NioDatagramConnector} with default configuration which will use a built-in * thread pool executor to manage the given number of processor instances. The processor class must have * a constructor that accepts ExecutorService or Executor as its single argument, or, failing that, a * no-arg constructor. * 使用简单处理器线程池,限定线程池处理线程实例数量 * @param processorClass the processor class. * @param processorCount the number of processors to instantiate. * @see SimpleIoProcessorPool#SimpleIoProcessorPool(Class, Executor, int, java.nio.channels.spi.SelectorProvider) * @since 2.0.0-M4 */ public NioDatagramConnector(Class<? extends IoProcessor<NioSession>> processorClass, int processorCount) { super(new DefaultDatagramSessionConfig(), processorClass, processorCount); } /** * Constructor for {@link NioDatagramConnector} with default configuration with default configuration which will use a built-in * thread pool executor to manage the default number of processor instances. The processor class must have * a constructor that accepts ExecutorService or Executor as its single argument, or, failing that, a * no-arg constructor. The default number of instances is equal to the number of processor cores * in the system, plus one. * 处理器线程数量为核心线程数+1与此方与SimpleIoProcessorPool#SimpleIoProcessorPool相似 * @param processorClass the processor class. * @see SimpleIoProcessorPool#SimpleIoProcessorPool(Class, Executor, int, java.nio.channels.spi.SelectorProvider) * @since 2.0.0-M4 */ public NioDatagramConnector(Class<? extends IoProcessor<NioSession>> processorClass) { super(new DefaultDatagramSessionConfig(), processorClass); } }
NioDatagramConnector上面结果构造方法与AbstractPollingIoConnector构造方法相似。
来看其他方法,这些方法很简单,一看就明白,不多讲。
/** * {@inheritDoc} 根据socket地址创建报文通道 */ @Override protected DatagramChannel newHandle(SocketAddress localAddress) throws Exception { //打开报文通道 DatagramChannel ch = DatagramChannel.open(); try { if (localAddress != null) { try { //绑定socket地址 ch.socket().bind(localAddress); //设置默认绑定的socket地址 setDefaultLocalAddress(localAddress); } catch (IOException ioe) { // Add some info regarding the address we try to bind to the // message String newMessage = "Error while binding on " + localAddress + "\n" + "original message : " + ioe.getMessage(); Exception e = new IOException(newMessage); e.initCause(ioe.getCause()); // and close the channel ch.close(); throw e; } } return ch; } catch (Exception e) { // If we got an exception while binding the datagram, // we have to close it otherwise we will loose an handle ch.close(); throw e; } } /** * {@inheritDoc} 连接远端socket地址,直接委托给报文通道 */ @Override protected boolean connect(DatagramChannel handle, SocketAddress remoteAddress) throws Exception { handle.connect(remoteAddress); return true; } /** * {@inheritDoc} 创建会话 */ @Override protected NioSession newSession(IoProcessor<NioSession> processor, DatagramChannel handle) { NioSession session = new NioDatagramSession(this, handle, processor); session.getConfig().setAll(getSessionConfig()); return session; } /** @Override * {@inheritDoc} */ @Override protected void init() throws Exception { // Do nothing } /** * {@inheritDoc} */ @Override protected void register(DatagramChannel handle, ConnectionRequest request) throws Exception { throw new UnsupportedOperationException(); } /** * {@inheritDoc} */ @Override protected int select(int timeout) throws Exception { return 0; } /** * {@inheritDoc} */ @Override protected void wakeup() { // Do nothing } /** * {@inheritDoc} 关闭报文通道 */ @Override protected void close(DatagramChannel handle) throws Exception { handle.disconnect(); handle.close(); } /** * {@inheritDoc} */ @Override protected void destroy() throws Exception { // Do nothing } /** * {@inheritDoc} */ @Override protected boolean finishConnect(DatagramChannel handle) throws Exception { throw new UnsupportedOperationException(); } /** * {@inheritDoc} 获取传输元数据 */ @Override public TransportMetadata getTransportMetadata() { return NioDatagramSession.METADATA; } /** * {@inheritDoc} */ @Override public DatagramSessionConfig getSessionConfig() { return (DatagramSessionConfig) sessionConfig; } /** * {@inheritDoc} */ @Override public InetSocketAddress getDefaultRemoteAddress() { return (InetSocketAddress) super.getDefaultRemoteAddress(); } /** * {@inheritDoc} */ @Override public void setDefaultRemoteAddress(InetSocketAddress defaultRemoteAddress) { super.setDefaultRemoteAddress(defaultRemoteAddress); } /** * {@inheritDoc} */ // Unused extension points. @Override protected Iterator<DatagramChannel> allHandles() { return Collections.emptyIterator(); } /** * {@inheritDoc} */ @Override protected ConnectionRequest getConnectionRequest(DatagramChannel handle) { throw new UnsupportedOperationException(); } /** * {@inheritDoc} */ @Override protected Iterator<DatagramChannel> selectedHandles() { return Collections.emptyIterator(); }
总结:
由于报文连接器是面向无连接的,与选择器有关的操作要么不支持,要么空体,要么返回空集合;连接操作直接委托报文通道;绑定地址,首先打开一个报文通道,然后由报文通道关联的报文socket完成实际的地址绑定。
发表评论
-
Mina 报文监听器NioDatagramAcceptor二(发送会话消息等)
2017-06-13 16:01 1544Mina 报文监听器NioDatagramAcceptor一( ... -
Mina 报文监听器NioDatagramAcceptor一(初始化,Io处理器)
2017-06-13 09:51 2578Mina Io监听器接口定义及抽象实现:http://dona ... -
Mina 报文通信简单示例
2017-06-12 09:01 2586MINA TCP简单通信实例:http://donald-dr ... -
Mina socket连接器(NioSocketConnector)
2017-06-12 08:37 4776Mina 抽象Polling连接器(AbstractPolli ... -
Mina 抽象Polling连接器(AbstractPollingIoConnector)
2017-06-11 21:29 1010Mina 连接器接口定义及抽象实现(IoConnector ) ... -
Mina 连接器接口定义及抽象实现(IoConnector )
2017-06-11 13:46 1835Mina IoService接口定义及抽象实现:http:// ... -
Mina socket监听器(NioSocketAcceptor)
2017-06-09 08:44 3424Mina IoService接口定义及抽象实现:http:// ... -
Mina 抽象polling监听器
2017-06-08 22:32 786Mina Io监听器接口定义及抽象实现:http://dona ... -
Mina Io监听器接口定义及抽象实现
2017-06-07 13:02 1352Mina IoService接口定义及抽象实现:http:// ... -
Mina IoService接口定义及抽象实现
2017-06-06 23:44 1200Mina IoHandler接口定义:http://donal ... -
Mina Nio会话(Socket,DataGram)
2017-06-06 12:53 1210Mina Socket会话配置:http://donald-d ... -
Mina 抽象Io会话
2017-06-05 22:45 1017Mina Io会话接口定义:http://donald-dra ... -
Mina Io会话接口定义
2017-06-04 23:15 1170Mina Nio处理器:http://donald-drape ... -
Mina Nio处理器
2017-06-04 22:19 745Mina Io处理器抽象实现:http://donald-dr ... -
Mina Io处理器抽象实现
2017-06-03 23:52 1151Mina 过滤链抽象实现:http://donald-drap ... -
Mina IoHandler接口定义
2017-06-01 21:30 1736Mina 过滤链抽象实现:http://donald-drap ... -
MINA 多路复用协议编解码器工厂二(多路复用协议解码器)
2017-06-01 12:52 2279MINA 多路复用协议编解码器工厂一(多路复用协议编码器): ... -
MINA 多路复用协议编解码器工厂一(多路复用协议编码器)
2017-05-31 22:22 1873MINA 多路分离解码器实例:http://donald-dr ... -
Mina 累计协议解码器
2017-05-31 00:09 1234MINA 编解码器实例:http://donald-drape ... -
Mina 协议编解码过滤器三(会话write与消息接收过滤)
2017-05-28 07:22 1753Mina 协议编解码过滤器一(协议编解码工厂、协议编码器): ...
相关推荐
在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理方面的实践。 1. **Mina的高级使用** Mina的核心在于其异步事件驱动的模型,这使得它在处理大量并发连接时表现出色。...
在"mina学习基础-入门实例-传输定长报文(三)"这个主题中,我们将深入探讨如何使用Mina实现定长报文的传输,并且利用Mina内置的SSL过滤器进行报文加密。 首先,让我们了解什么是定长报文。在通信协议中,定长报文是...
Mina提供了一种事件驱动的模型,通过IoSession接口来管理连接,包括读写数据、添加监听器、关闭连接等操作。IoSession是连接状态的容器,包含了会话中的所有信息,如远程地址、本地地址、缓冲区大小、已发送和接收的...
**mina自定义编解码器详解** mina是一个Java开发的网络通信框架,广泛应用于TCP和UDP协议的服务器和客户端开发。在mina框架中,编解码器(Codec)扮演着至关重要的角色,它负责将应用层的数据转换为网络传输的字节...
本文将深入探讨Mina框架中的长连接与短连接,并通过提供的Minaclient和MinaHost工程实例进行详细解析。 首先,我们需要了解什么是长连接和短连接。在TCP/IP通信中,短连接是指一次完整的通信过程(如HTTP请求)结束...
Apache Mina是一个流行的Java框架,专门用于简化和优化网络应用开发,它支持多种协议如TCP/IP、UDP/IP等,并提供了长连接和短连接的支持。在这个实例中,我们将探讨如何使用Mina实现长连接和短连接。 首先,理解长...
4. **ProtocolCodec**:Mina2的编码解码机制,允许开发者定义自定义的编码器和解码器。这对于处理复杂的数据格式(如XML、JSON或自定义协议)非常有用。 5. **Acceptor**:Acceptor是监听特定端口并处理连接请求的...
综上所述,MINA长连接框架在实现服务器与Android客户端通讯时,涉及到网络编程、数据传输协议、异常处理、过滤器机制、长连接维护等多个技术要点,开发者需要根据实际需求进行合理的架构设计和优化。通过MINA提供的...
Socket通信和MINA长连接是网络编程中的两个关键概念,主要应用于服务器与客户端之间的数据交互。在移动应用开发,特别是需要实时推送功能时,这两种技术显得尤为重要。 **Socket通信** Socket,也称为套接字,是...
- **编码与解码**:在Mina中,我们需要实现`org.apache.mina.core.session.IoEventType`事件的编码器和解码器,将自定义的数据结构转换成字节流在网络中传输,接收端再将字节流转回原始数据结构。 2. **创建Mina...
3. **过滤器链**:MINA的核心设计之一就是过滤器链,它允许开发者在数据发送和接收的过程中插入自定义的处理逻辑。在实现加密通信时,我们需要创建一个包含SSLFilter的过滤器链,这个过滤器负责处理SSL/TLS相关的...
在这个"mina 长连接 客户端+服务端"的示例中,我们将探讨如何使用Mina实现长连接以及收发消息的功能。 长连接是网络通信中的一种模式,与短连接相对。短连接在每次通信后都会关闭连接,而长连接则保持连接状态,...
1. 服务器端代码:使用MINA的ServerBootstrap和IoHandler实现服务端,监听指定端口并处理客户端连接。 2. 客户端代码:创建IoConnector连接到服务器,并发送数据。 3. 过滤器:可能包含自定义的IoFilter,用于数据的...
文件"MinaSocket"可能包含了实现上述功能的详细代码,包括服务端的Acceptor配置、过滤器设置、事件处理器编写,以及客户端的Socket连接、数据发送和接收等。通过阅读和理解这些代码,你可以更好地掌握Mina与Socket...
2.mina若有空闲连接则使用已有连接,若无则新建mina连接; 3.mina空闲连接超过保活时间25分钟后,自动删除; 4.mina发送指令后,接收指定时长内收到的消息; <groupId>org.apache.mina <artifactId>mina-core ...
在大数据传输场景中,MINA因其非阻塞I/O模型而被广泛采用,能够高效地处理大量并发连接,这对于大数据的实时传输和处理至关重要。 描述中提到的“mina自定义编解码”是MINA框架的一个关键特性。MINA允许开发者...
《mina编解码器Demo详解》 mina是一个高性能、异步事件驱动的网络通信框架,主要应用于Java平台,常用于构建TCP和UDP服务。在本文中,我们将深入探讨MINA框架中的编解码器(Codec)概念,并通过提供的`mina_server`...
在`mina src`压缩包中,可能包含MINA框架的源代码,你可以通过阅读这些源码来深入理解MINA的工作原理,特别是过滤器和解码器的实现。这对于学习MINA、理解和定制自己的网络服务非常有帮助。同时,结合提供的博客链接...
本文将深入探讨如何在Mina中自定义编码解码器,这对于实现特定的网络通信协议至关重要。 首先,了解Mina的编码解码器架构是必要的。Mina使用了Chain of Responsibility设计模式,通过Filter链来处理进来的数据。...
**Android-MinaSocket:基于Mina的高效Socket长连接库** 在移动应用开发中,尤其是Android平台,实时性与稳定性是许多应用场景的核心需求,比如在线游戏、即时通讯、物联网设备等。在这种背景下,使用Socket进行长...