为什么mina 服务端 关闭连接通过手机打开一个连接需要好长时间

Android使用Apach Mina入门读书(一)
来源:博客园
最近开发一个项目需要用到Client(Android)透过Socket与Server通讯,网上有看到Apache封装好的Socket通讯包,初步学习。
内容主要来源于(MINA官方教程(中文版))
1.网络应用架构:

基于ApacheMINA的网络应用有三个层次,分别是I/O服务、I/O过滤器和I/O处理器:?I/O服务:I/O服务用来执行实际的I/O操作。ApacheMINA已经提供了一系列支持不同协议的I/O服务,如TCP/IP、UDP/IP、串口和虚拟机内部的管道等。开发人员也可以实现自己的I/O服务。?I/O过滤器:I/O服务能够传输的是字节流,而上层应用需要的是特定的对象与数据结构。
I/O过滤器用来完成这两者之间的转换。I/O过滤器的另外一个重要作用是对输入输出的数据进行处理,满足横切的需求。多个I/O过滤器串联起来,形成I/O过滤器链。?I/O处理器:I/O处理器用来执行具体的业务逻辑。对接收到的消息执行特定的处理。创建一个完整的基于ApacheMINA的网络应用,需要分别构建这三个层次。
2.完成Client代码初始化四步骤:
//第一步:创建连接对象:
SocketConnector connector = new NioSocketConnector();
//第二步:给该连接对象设置处理对象:(IoHandlerAdapter)
ClientHandler handler = new ClientHandler();
connector.setHandler(handler);
// 第三步:添加过滤器:
connector.getFilterChain().addLast("codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),
LineDelimiter.WINDOWS.getValue(), LineDelimiter.WINDOWS.getValue())));
//第四步:绑定即将通信对象:
connector.connect(new InetSocketAddress("192.168.1.101", 5260));
3. I/O服务(IoService是I/O服务的接口,继承 IoAcceptor)
I/O服务用来执行真正的I/O操作,以及管理I/O会话。根据所使用的数据传输方式的不同,有不同的I/O服务的实现。由于I/O服务执行的是输入和输出两种操作,实际上有两种具体的子类型。一种称为“I/O接受器(I/Oacceptor)”,用来接受连接,一般用在服务器的实现中;另外一种称为“I/O连接器(I/Oconnector)”,用来发起连接,一般用在客户端的实现中。
表1.IoService中的重要方法方法说明setHandler(IoHandlerhandler):设置I/O处理器。该I/O处理器会负责处理该I/O服务所管理的所有I/O会话产生的I/O事件。getFilterChain()获取I/O过滤器链,可以对I/O过滤器进行管理,包括添加和删除I/O过滤器。getManagedSessions():获取该I/O服务所管理的I/O会话。
I/O连接器 Code Example:
SocketConnectorconnector=newNioSocketConnector();
connector.setConnectTimeoutMillis(CONNECT_TIMEOUT);connector.getFilterChain().addLast("logger",newLoggingFilter());
connector.getFilterChain().addLast("protocol",newProtocolCodecFilter(newTetrisCodecFactory()));ConnectFutureconnectFuture=connector.connect(newInetSocketAddress(host,port));
connectFuture.awaitUninterruptibly();
4.I/O会话(IoSession)
I/O会话表示一个活动的网络连接,与所使用的传输方式无关。I/O会话可以用来存储用户自定义的与应用相关的属性。这些属性通常用来保存应用的状态信息,还可以用来在I/O过滤器和I/O处理器之间交换数据。I/O会话在作用上类似于Servlet规范中的HTTP会话。
表2.IoSession中的重要方法方法说明:close(booleanimmediately):关闭当前连接。如果参数immediately为true的话,连接会等到队列中所有的数据发送请求都完成之后才关闭;否则的话就立即关闭。getAttribute(Objectkey):从I/O会话中获取键为key的用户自定义的属性。setAttribute(Objectkey,Objectvalue):将键为key,值为value的用户自定义的属性存储到I/O会话中。removeAttribute(Objectkey):从I/O会话中删除键为key的用户自定义的属性。write(Objectmessage):将消息对象message发送到当前连接的对等体。该方法是异步的,当消息被真正发送到对等体的时候,IoHandler.messageSent(IoSession,Object)会被调用。如果需要的话,也可以等消息真正发送出去之后再继续执行后续操作。
这个接口有如下常用的方法:A. WriteFuture write(Object message):这个方法用于写数据,该操作是异步的。B. CloseFuture close(boolean immediately):这个方法用于关闭IoSession,该操作也是异步的,参数指定true 表示立即关闭,否则就在所有的写操作都flush 之后再关闭。C. Object setAttribute(Object key,Object value):这个方法用于给我们向会话中添加一些属性,这样可以在会话过程中都可以使用,类似于HttpSession 的setAttrbute()方法。IoSession 内部使用同步的HashMap 存储你添加的自定义属性。
5.I/O过滤器(IoFilterAdapter)
从I/O服务发送过来的所有I/O事件和请求,在到达I/O处理器之前,会先由I/O过滤器链中的I/O过滤器进行处理。过滤器可以在很多情况下使用,比如记录日志、性能分析、访问控制、负载均衡和消息转换等。过滤器非常适合满足网络应用中各种横切的非功能性需求。在一个基于ApacheMINA的网络应用中,一般存在多个过滤器。这些过滤器互相串联,形成链条,称为过滤器链。每个过滤器依次对传入的I/O事件进行处理。当前过滤器完成处理之后,由过滤器链中的下一个过滤器继续处理。当前过滤器也可以不调用下一个过滤器,而提前结束,这样I/O事件就不会继续往后传递。比如负责用户认证的过滤器,如果遇到未认证的对等体发出的I/O事件,则会直接关闭连接。这可以保证这些事件不会通过此过滤器到达I/O处理器。
表3.IoFilter中与过滤器的生命周期相关的方法
init():当过滤器第一次被添加到过 滤器链中的时候,此方法被调用。用来完成过滤器的初始化工作。 
onPreAdd(IoFilterChainparent,Stringname,IoFilter.NextFilternextFilter): 当过滤器即将被添加到过滤 器链中的时候,此方法被调用。 
onPostAdd(IoFilterChainparent,String name,IoFilter.NextFilternextFilter):当过滤器已经被添加到过滤器链中之后,此方法被调用
onPreRemove(IoFilterChainparent,Stringname,IoFilter.NextFilternextFilter):当过滤器即将被从过滤器链中删除的时候,此方法被调用。onPostRemove(IoFilterChainparent,Stringname,IoFilter.NextFilternextFilter):当过滤器已经被从过滤器链中删除的时候,此方法被调用。destroy():当过滤器不再需要的时候,它将被销毁,此方法被调用
参数parent表示包含此过滤器的过滤器链,参数name表示过滤器的名称,参数nextFilter表示过滤器链中的下一个过滤器。
filterClose(IoFilter.NextFilternextFilter,IoSessionsession):滤对IoSession的close方法的调用。filterWrite(IoFilter.NextFilternextFilter,IoSessionsession,WriteRequestwriteRequest):滤对IoSession的write方法的调用。exceptionCaught(IoFilter.NextFilternextFilter,IoSessionsession,Throwablecause):滤对IoHandler的exceptionCaught方法的调用。
messageReceived(IoFilter.NextFilternextFilter,IoSessionsession,Objectmessage):过滤对IoHandler的messageReceived方法的调用。
messageSent(IoFilter.NextFilternextFilter,IoSessionsession,WriteRequestwriteRequest):过滤对IoHandler的messageSent方法的调用。
sessionClosed(IoFilter.NextFilternextFilter,IoSessionsession):过滤对IoHandler的sessionClosed方法的调用。sessionCreated(IoFilter.NextFilternextFilter,IoSessionsession):过滤对IoHandler的sessionCreated方法的调用。sessionIdle(IoFilter.NextFilternextFilter,IoSessionsession,IdleStatusstatus):过滤对IoHandler的sessionIdle方法的调用。
sessionOpened(IoFilter.NextFilternextFilter,IoSessionsession):过滤对IoHandler的sessionOpened方法的调用。
code example:
public void messageReceived(NextFilternextFilter,IoSessionsession,Objectmessage){if(!isON(session)){
nextFilter.messageReceived(session,message);
}else{
endSession(session);
}
}private void endSession(IoSessionsession){
session.close(true);
}
6.过滤器链(IoFilterChain)
过滤器只有在添加到过滤器链中的时候才起作用。过滤器链是过滤器的容器。过滤器链与I/O会话是一一对应的关系.
IoFilterChain接口的方法方法说明:addFirst(String name,IoFilterfilter filter):将指定名称的过滤器添加到过滤器链的开头。addLast(String name,IoFilterfilter filter):将指定名称的过滤器添加到过滤器链的末尾。
contains(String name)判断过滤器链中是否包含指定名称的过滤器。
get(String name):从过滤器链中获取指定名称的过滤器。
remove(String name):从过滤器链中删除指定名称的过滤器。replace(String name,IoFilter newFilter):用过滤器newFilter替换掉过滤器链中名为name的过滤器。
getSession():获取与过滤器链一一对应的I/O会话
7.I/O处理器(IoHandlerAdapter)
I/O事件通过过滤器链之后会到达I/O处理器。I/O处理器中与I/O事件对应的方法会被调用。ApacheMINA中org.apache.mina.core.service.IoHandler是I/O处理器要实现的接口,一般情况下,只需要继承自org.apache.mina.core.service.IoHandlerAdapter并覆写所需方法即可。
IoHandler接口的方法:
sessionCreated(IoSessionsession)当有新的连接建立的时候,该方法被调用。
sessionOpened(IoSessionsession)当有新的连接打开的时候,该方法被调用。该方法在sessionCreated之后被调用。sessionClosed(IoSessionsession)当连接被关闭的时候,此方法被调用。
sessionIdle(IoSessionsession,IdleStatusstatus)当连接变成闲置状态的时候,此方法被调用。exceptionCaught(IoSessionsession,Throwablecause)当I/O处理器的实现或是ApacheMINA中有异常抛出的时候,此方法被调用。messageReceived(IoSessionsession,Objectmessage)当接收到新的消息的时候,此方法被调用。
messageSent(IoSessionsession,Objectmessage)当消息被成功发送出去的时候,此方法被调用。
其中
1.sessionCreated和sessionOpened的区别:
sessionCreated方法是由I/O处理线程来调用的,而sessionOpened是由其它线程来调用的。因此从性能方面考虑,不要在sessionCreated方法中执行过多的操作。
2.sessionIdle,默认情况下,闲置时间设置是禁用的,也就是说sessionIdle并不会被调用。可以通过IoSessionConfig.setIdleTime(IdleStatus,int)来进行设置
 
常用方法:
1. WriteFuture的使用IoSessionsession=...;//获取I/O会话对象WriteFuturefuture=session.write("HelloWorld");//发送数据
future.awaitUninterruptibly();//等待发送数据操作完成
if(future.isWritten()){//数据已经被成功发送}else{//数据发送失败}由于这样的需求很常见,I/O处理器中提供了messageSent方法,当数据发送成功的时候,该方法会被调用。
2. JMX集成ApacheMINA可以集成JMX来对网络应用进行管理和监测。
MBeanServermBeanServer=ManagementFactory.getPlatformMBeanServer();
IoAcceptoracceptor=newNioSocketAcceptor();IoServiceMBeanacceptorMBean=newIoServiceMBean(acceptor);
ObjectNameacceptorName=newObjectName(acceptor.getClass().getPackage().getName()+":type=acceptor,name="+acceptor.getClass().getSimpleName));
mBeanServer.registerMBean(acceptorMBean,acceptorName);
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动扫一扫下载到手机
11MB/ 新闻资讯 /10
2MB/ 新闻资讯 /5.0
3MB/ 新闻资讯 /10
9MB/ 金融理财 /10
下载总览软件特权软件截图视频演示猜你喜欢下载地址相关文章用户评论
米娜app下载手机版:是一款为女性朋友打造的资讯软件,是你了解全球时尚风尚的窗口。每日为您推送全球最新的时尚资讯,带领你加入时尚潮流大军。想做一个时尚的女子,快来这里吧!
米娜app下载手机版功能: 1.为广大年轻女性度身定制的掌上时尚资讯平台; 2.米娜时尚网传递最新时尚潮流服饰搭配,美容护肤资讯; 3.米娜app同时是米娜卡娜时尚的官方网站。
活动内容:
截止时间:
领取方式:
活动条件:
猜你喜欢新闻资讯百科女神专属
足不出户通过手机就可知道天下事,大大小小的是事情都会通过各种新闻平台发布出来。我们每天只需要在手机新闻软件上刷新下就可以关注自己感兴趣的新闻。下面网侠小编给大家...
米娜app下载手机版
下载帮助网侠手机站软件均来自互联网, 如有侵犯您的版权, 请点击网站底部在线QQ进行联系。
1.网侠手机站所有软件和游戏都经过严格安装检测,保证不会有任何病毒木马等信息,请大家放心使用;
2.大家在安装软件的时候注意每个步骤,注意包含安装插件信息,推荐使用下载本站软件以获取最佳的下载速度。
3.如果您觉得网侠还不错, 以便下一次的访问.
4.网侠QQ群:应用软件交流群: 手机游戏交流:(满),加入二群:&我要MP3铃声下载站[]:本站手机铃声免费下载,提供mp3铃声在线试听、上传功能,欢迎大家一起上传分享好铃声!
本站手机无线访问地址:
&&&&注:本站提供手机铃声试听上传下载服务,欢迎大家一起来分享好铃声。。。
 铃声站内搜索:
&热门关键字:
Mina手机铃声下载,我要MP3铃声下载站
&&当前位置:&& Mina手机铃声
wawa198601
每页显示 30 首
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
页次:<font color="#ff页 转到:
本歌手下载TOP10
&&我们友情提醒您:若您喜欢和支持本站[]的话,请将它发给您的好友!
免费手机铃声|手机铃声之家| 手机铃声网
客户服务及广告与合作洽谈{QQ}:338382 验证后直接留言
我要MP3手机铃声下载站 Copyright&
51MP3ring.com, 免费铃声 版本信息:51mp3ring Ver3.0 手机铃音
网站备案编号:
声明:本站提供的所有资源,均由网友上传搜集整理,版权归原作者所有!如果喜欢请购买正版.本站不承担任何版权问题。若侵犯了您的权益,敬请通知我们!更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
使用您的微博帐号登录,即刻尊享微博用户专属服务。
使用您的QQ帐号登录,即刻尊享QQ用户专属服务。
使用您的人人帐号登录,即刻尊享人人用户专属服务。
按住视频可进行拖动
把视频贴到Blog或BBS
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
收藏成功,可进入查看所有收藏列表
方式1:用手机看
用爱奇艺APP或微信扫一扫,在手机上继续观看:
方式2:一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:&&
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:&&
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
爸爸去哪儿2游戏 立即参与
播放量数据:
9,991人已订阅
你可能还想订阅他们:
{{#needAdBadge}} 广告{{/needAdBadge}}
&正在加载...
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
安装爱奇艺视频客户端,
马上开始为您下载本片
5秒后自动消失
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制您的位置:
Phominator图片清理助手
Phominator图片清理助手v1.0.1
如今的手机直播行业已经成为了网络大军中的一股新生力量,通过手机进行直播方便快捷,用户们看直播也更加方便。现如今的直播内容也越来越丰富,不再局限于游戏直播与才艺直…
现如今直播行业迅猛发展,以前还觉得很新奇的东西如今在我们的身边已经越来越普及,以至于在手机端上的直播APP软件也是如雨后春笋般络绎不绝的出现,下面小编就来为大家…
安卓版下载
本站仅创建用户沟通交流的平台,所展示的安卓软件资源内容来自于第三方上传分享,版权问题均与我站无关。资源仅作为用户间分享讨论之用,除开发商授权外不以盈利为目的。如该游戏触犯了您的权利,请申诉!邮箱:
1486人推荐
热门软件:
最新软件:
拍照摄影:
CopyRight2004年-年
游迅网 All Rights Reserved
备案编号:沪ICP备号-9

我要回帖

更多关于 mina连接池 的文章

 

随机推荐