关于Apache Mina
- 格式:doc
- 大小:88.00 KB
- 文档页数:5
Servlet,Tomcat,Jetty,Netty,Mina对⽐Servlet, Tomcat, Jetty, Netty,Mina结论先说结论吧: Servlet是⼀种Java EE规范,Tomcat & Jetty是Servlet容器,Tomcat包含了Servlet。
Servlet本⾝并不能处理外部请求,需要Servlet容器的配合,Netty和MINA是⽹络框架,我们可以使⽤Netty造出⾃⼰类似Tomcat的web服务器。
简单的关系的话 Tomcat = Jetty > Netty & MINA > Servlet。
Servletwiki上的定义:Servlet 是⽤ Java 编写的服务器端程序。
其主要功能在于交互式地浏览和修改数据,⽣成动态 Web 内容。
狭义的 Servlet 是指Java 语⾔实现的⼀个接⼝,⼴义的 Servlet 是指任何实现了这个 Servlet 接⼝的类,⼀般情况下,⼈们将 Servlet 理解为后者。
Tomcatwiki的定义:Tomcat 是由 Apache 软件基⾦会下属的 Jakarta 项⽬开发的⼀个 Servlet 容器,按照 Sun Microsystems 提供的技术规范,实现了对 Servlet 和 JavaServer Page(JSP)的⽀持,并提供了作为 Web 服务器的⼀些特有功能,如 Tomcat 管理和控制平台、安全域管理和 Tomcat 阀等。
由于 Tomcat 本⾝也内含了⼀个 HTTP 服务器,它也可以被视作⼀个单独的 Web 服务器。
但是,不能将 Tomcat 和 Apache HTTP 服务器混淆,Apache HTTP 服务器是⼀个⽤C语⾔实现的 HTTPWeb服务器;这两个 HTTP web server 不是捆绑在⼀起的。
Apache Tomcat 包含了⼀个配置管理⼯具,也可以通过编辑XML格式的配置⽂件来进⾏配置。
openfire和mina(一)2009-06-04 17:51 2144人阅读评论(3) 收藏举报看了几天的openfire,网上的资料太少了,只有一个国外的网站不错,/,其他的只能自己摸索了。
openfire启动:ServerStarter会加载org.jivesoftware.openfire.XMPPServer在XMPPServer会加载一系列模块其中的ConnectionManagerImpl 是连接模块// Load this module always last since we don't want to start listening for clients // before the rest of the modules have been startedloadModule(ConnectionManagerImpl.class.getName());ConnectionManagerImpl 会启动一系列的监听。
其中的createClientListeners和startClientListeners是我比较关心的,先看看再这里面openfire都做了什么!private void createClientListeners() {// Start clients plain socket unless it's been disabled.if (isClientListenerEnabled()) {// Create SocketAcceptor with correct number of processorssocketAcceptor = buildSocketAcceptor();// Customize Executor that will be used by processors to process incoming stanzasExecutorThreadModel threadModel = ExecutorThreadModel.getInstance("client" );int eventThreads = JiveGlobals.getIntProperty("xmpp.client.processing.threads" , 16);ThreadPoolExecutor eventExecutor =(ThreadPoolExecutor)threadModel.getExecutor();eventExecutor.setCorePoolSize(eventThreads + 1);eventExecutor.setMaximumPoolSize(eventThreads + 1);eventExecutor.setKeepAliveTime(60, TimeUnit.SECONDS );socketAcceptor .getDefaultConfig().setThreadModel(threadModel);// Add the XMPP codec filtersocketAcceptor .getFilterChain().addFirst("xmpp" , new ProtocolCodecFilter(new XMPPCodecFactory()));// Kill sessions whose outgoing queues keep growing and fail to send trafficsocketAcceptor .getFilterChain().addAfter("xmpp" , "outCap ", new StalledSessionsFilter());}}对了这里就是和用的mian框架去做联网处理,首先设置mina框架的线程池,然后把由XMPPCodecFactory做为ProtocolCodecFilter的chain添加到FilterChain中!然后private void startClientListeners(String localIPAddress) {// Start clients plain socket unless it's been disabled.if (isClientListenerEnabled()) {int port = getClientListenerPort();try {// Listen on a specific network interface if it has been set.String interfaceName = JiveGlobals.getXMLProperty("network.interface");InetAddress bindInterface = null;if (interfaceName != null) {if (interfaceName.trim().length() > 0) {bindInterface = InetAddress.getByName(interfaceName);}}// Start accepting connectionssocketAcceptor.bind(new InetSocketAddress(bindInterface, port), new ClientConnectionHandler(serverName));ports.add(new ServerPort(port, serverName, localIPAddress, false, null, ServerPort.Type.client));List<String> params = new ArrayList<String>();params.add(Integer.toString(port));(LocaleUtils.getLocalizedString("startup.plain", params));}catch (Exception e) {System.err.println("Error starting XMPP listener on port " + port + ": " +e.getMessage());Log.error(LocaleUtils.getLocalizedString("admin.error.socket-setup"), e);}}}socketAcceptor.bind(new InetSocketAddress(bindInterface, port), new ClientConnectionHandler(serverName));将ClientConnectionHandler作为数据处理服务器去监听5222端口去了,mina真方便!关于MINA框架可以去网上找找资料,这里就不说了。
最近做的一个项目用到了开源的C/S应用的服务器框架MINA,当初做的时候资料非常少,只能自己不停的测试,总结出了一些规律经验。
从网上看的资料上看,这个服务器框架还是比较稳定和支持的并发数还是很不错的,不过没有准确的数据,而且我做完的时候也没有拿到真正的实际环境中测试过,用的时候也发现了很多优点和缺点,使用者可以自己去根据自己的使用需求去衡量是否使用该框架。
服务器是商业系统很重要的一部分,主要负责数据采集,文件分发,与端机的通信,和自动作业等任务,服务器大多是24小时运行的,因此服务器的实现必须强壮、稳定、安全,而速度虽然也是很重要,不过最重要的还是前三者。
服务器框架MINA就是要为这样的服务器提供了一个网络应用框架,当然这样的服务器框架也可以自己去实现。
MINA为我们封装了socket的底层通信实现,提供了日志,线程池等功能,使用起来非常简单、方便。
MINA是一个异步框架,是通过网络事件激发的,它包含两层:IO层和协议层。
首先介绍IO 层,要说明的是我用的版本是0.8.2,可能不同版本会稍有不同。
Client产生一个底层IO事件,比如说连接和发送数据包,IoAcceptor执行所有底层IO,将他们翻译成抽象的IO事件,接着这里可以添加(也可以部添加)一个IoFilters对IO事件进行过滤,并把翻译过的事件或过滤过的事件和关联的IoSession 发送给IoHandler。
IoSession是一个有效的网络连接会话,此会话将一直保持连接,除非网络断开或用户主动断开连接(session.close()),用户可以通过IoSession获得有关该会话连接的信息和配置会话的对象和属性;IoHandler是网络事件的监听器,也就是说当有网络事件发生时会通知IoHandler,用户不用去主动接受数据。
用户只要实现此接口爱干吗干吗去吧。
IoFilter:Io过滤器,对Io 事件进行过滤,比如添加日志过滤器和线程池过滤器。
Apache Mina入门目录一:说明 (1)二、实践:传送字符串的简单c/s (1)三、总结: (6)四、使用Mina 直接传送对象: (8)五、结论: (9)Mina是什么?考,上/己看啊,一句话就是“一个简洁易用的基于Tcp/IP通信的java框架“,什么?什么是框架?再问你就不要向下看了。
Mina能干什么?先拉出来溜一下:我们用它做两个小程序,一个为服务器,收到客户机的消息后,就回送给客户机;一个是简单的客户机,一连上服务器,就发一条消息报到,然后将从服务器接到的消息再发给服务器。
嗯,你是否意识到这是一个死循环的C/S通信?折腾机器这叫,编程就是要先能折腾!二、实践:传送字符串的简单c/s第一步:当然是下载Mina,然后在ec里建个项目,将下载后的mina-core-2.0.0-M1.jar 这个包加到你的新建的Project的lib中。
第二步编,写服务器代码:服务器端由两个类组成,一个是Min.java,启动服务器的主类;另一个是SamplMinaServerHandler.java,这个类负责处理连结上来的客户机,即消息处理器。
看代码了:处理器是是我们重写了mon.IoHandlerAdapter的一个类,其中被重写的方法,你根据方法名应可以想到这些方法的用途吧?!编程还有一点很重要,就是要会连猜带蒙。
意思是org.slf4j.LoggerFactory 这个类找不到?怎么办?google啊!slf4j也是一个开源的项目,专用做日志记录,到/上面去下载后,将log4j-over-slf4j-1.5.0.jar、和slf4j-nop-1.5.0.jar这两个jsr包加到项目中,再运行!如果还报错,那烦请你告诉我,我再去google!如果运行成功,就进行下一步吧:第三步:测试服务器:非要编写客户端代码才能测试吗?N!,启动服务器,我们使用命令行的Telnet测试:现在你只要按一下回车,命令行的telnet就会做为一个client连上我们编写的服务器:如果能像上图那样收发消息,(不要忘了,在命令行输入消息后要qiao回车,消息才会发送到服务器),就证明你的服务器编写成功了!总是用telnet不行吧,用Mina编写客户机,跟服务器是一样的简单!go on!第四步:实现Mina的客户机:就不废话了,还是两个类,一个启动主类,一个消息处理器:编写完成,启动服务器,再启动客户机,让你的机器狂奔吧!!!三、总结:所谓总结,是我们这两个程序中用到了Mina包中的几个API,我们分析其用途而己,其实这个总结应该你自己查看Mina的文档来完成:开发一个Mina应用,简单的说,就是创建连结,设定过滤规则,编写自己的消息处理器这三步!比我们直接用Socket/ServerSocket思路清晰得多了吧。
APACHE MINA 介绍一个高性能的NIO框架•MINA 的用途•MINA 选择MINA的理由•MINA 的快速入门•MINA 的高级话题讲座目标背景,用途以及所支持的功能的一个简略介绍,让大家认识MINA,对它有个初步概念。
这就是本章的目的。
在java世界中,框架繁多,就网络框架而言,我们为什么要选择MINA2这确实值得我们探讨一下。
下面的小节中将本着对软件开发最基本的两点出发进行对比:1.性能的对比2.程序实现的复杂性对比在传统I/O中,最简单实现高并发服务器的编程方式就是对每一个客户开启一个线程。
但是这种方式有如下几个弊端:•客户端上限很大的情况下不能及时响应•服务器硬件资源受限,性能也会急剧下降•受制于操作系统的限制优点还是有的:•编码简单,实现容易•一定数量的连接性能比较好。
参见实例:TraditionalIOServer0从图中可见,每一个线程维护了一组用户,然后每一个线程不断的轮询用户,哪个用户可读就读取相应的可读字节数,也就是这种方式避免了读的阻塞。
但是这种方式是一种被动的方式,也就是说不管用户是否可读,都需要去轮询。
为了解决这一问题,异步的NIO就成了不二之选选择MINA的理由NIO简单介绍JDK1.4提供的无阻塞I/O(NIO)有效解决了多线程服务器存在的线程开销问题,又同时避免了轮询问题,但在使用上略显得复杂一些。
NIO的核心思想就是多路复用,与模型二类似。
但是它是基于事件机制,所以这就是能避开轮询的原因。
但是需要注意的是,他们本质上是不同的,模型二只能算是一个模拟的多路复用,而NIO则是利用OS底层以及一些别的技术来达到异步多路复用的目的。
看完几个实际的MINA例子后可以很轻易的总结出利用MINA编程的几个大致步骤:1.创建一个实现了IoService接口的类2.设置一个实现了IoFilter接口的过滤器(如果有需要的情况下)3.设置一个IoHandler接口实现的处理类,用于处理事件(必须)4.对IoService绑定一个端口开始工作IoProcessor是处理请求的分配,包括选择Selector,超时验证,状态记录等。
客户端通信过程1.通过SocketConnector同服务器端建立连接2.链接建立之后I/O的读写交给了I/O Processor线程,I/O Processor是多线程的3.通过I/O Processor读取的数据经过IoFilterChain里所有配置的IoFilter,IoFilter进行消息的过滤,格式的转换,在这个层面可以制定一些自定义的协议4.最后IoFilter将数据交给Handler进行业务处理,完成了整个读取的过程5.写入过程也是类似,只是刚好倒过来,通过IoSession.write写出数据,然后Handler进行写入的业务处理,处理完成后交给IoFilterChain,进行消息过滤和协议的转换,最后通过I/O Processor将数据写出到socket通道IoFilterChain作为消息过滤链1.读取的时候是从低级协议到高级协议的过程,一般来说从byte字节逐渐转换成业务对象的过程2.写入的时候一般是从业务对象到字节byte的过程IoSession贯穿整个通信过程的始终整个过程可以用一个图来表现消息箭头都是有NioProcessor-N线程发起调用,默认情况下也在NioProcessor-N线程中执行类图/class-diagrams.html#ClassDiagrams-ProtocolDeco derclassdiagramConnector作为连接客户端,SocketConector用来和服务器端建立连接,连接成功,创建IoProcessor Thread(不能超过指定的processorCount),Thread由指定的线程池进行管理,IoProcessor 利用NIO框架对IO进行处理,同时创建IoSession。
连接的建立是通过Nio的SocketChannel进行。
NioSocketConnector connector = new NioSocketConnector(processorCount); ConnectFuture future = connector.connect(new InetSocketAddress(HOSTNAME, PORT));建立一个I/O通道Acceptor作为服务器端的连接接受者,SocketAcceptor用来监听端口,同客户端建立连接,连接建立之后的I/O操作全部交给IoProcessor进行处理IoAcceptor acceptor = new NioSocketAcceptor();acceptor.bind( new InetSocketAddress(PORT) );Protocol利用IoFilter,对消息进行解码和编码,如以下代码通过 MyProtocolEncoder 将java对象转成byte串,通过MyProtocalDecoder 将byte串恢复成java对象Java代码1.connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MyProtocalFactory()));2.......3.public class MyProtocalFactory implements ProtocolCodecFactory{4. ProtocolEncoderAdapter encoder = new MyProtocolEncoder();5. ProtocolDecoder decoder = new MyProtocalDecoder() ;6. public ProtocolDecoder getDecoder(IoSession session) throws Exception {7. return decoder;8. }9. public ProtocolEncoder getEncoder(IoSession session) throws Exception {10. return encoder;11. }12.}13.......14.public class MyProtocalDecoder extends ProtocolDecoderAdapter{15.16. public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)17. throws Exception {18.19. int id = in.getInt();20. int len = in.getInt();21. byte[] dst = new byte[len];22.23. in.get(dst);24.25. String name = new String(dst,"GBK");26.27. Item item = new Item();28. item.setId(id);29. item.setName(name);30. out.write(item);31. }32.}33.......34.public class MyProtocolEncoder extends ProtocolEncoderAdapter {35.36. public void encode(IoSession session, Object message,37. ProtocolEncoderOutput out) throws Exception {38. Item item = (Item)message;39. int byteLen = 8 + item.getName().getBytes("GBK").length ;40. IoBuffer buf = IoBuffer.allocate(byteLen);41. buf.putInt(item.getId());42. buf.putInt(item.getName().getBytes("GBK").length);43. buf.put(item.getName().getBytes("GBK"));44. buf.flip();45. out.write(buf);46.47. }48.}handler具体处理事件,事件包括:sessionCreated、sessionOpened、sessionClosed、sessionIdle、exceptionCaught、messageReceived、messageSent。
深入理解Apache Mina----IoFilter和IoHandler的区别和联系在《与IoFilter相关的几个类》和《与IoHandler相关的几个类》两篇文档中我们了解了IoFilter 和IoHandler的基本用法,以及其相关类的作用和用途。
在本文中主要探讨IoFilter和IoHandler的主要区别和联系。
在上面的两篇文档中都提到了IoFilter和IoHandler都是对服务器或客户端(IoAcceptor/IoConnector)接收到的数据进行处理。
在Mina的官方文档《The high-performance protocol construction toolkit》给出了IoFilter和IoHandler在Mina数据传输中的执行顺序,如下图:上图显示了IoService进行数据读写时,各主要组件的执行顺序:(1)IoService读取数据时个组件的执行顺序是:IoProcessor-->IoFilter-->IoHandl e r。
(2)IoService发送数据时的执行数顺序:IoHandler-->IoFilter-->IoProcessor。
IoProcessor是一个处理线程,它的主要作用是根据当前连接的状态的变化(创建会话、开启会话、接收数据、发送数据、发生异常等等),来将数据或事件通知到IoFilter,当IoFilter 的相应的方法接收到该状态的变化信息是会对接收到的数据进行处理,处理完毕后会将该事件转发到IoHandler中,有IoHandler完成最终的处理。
在这里IoProcessor的主要功能是创建资源(创建/分配线程给IoFilter)和数据转发(转发到IoFilter),IoFilter对数据进行基本的分类(如编解码),IoHandler则负责具体的逻辑实现。
也就是说IoFilter对接收到的数据包的具体内容不做处理,而是有IoHandler来对所接收到的数据包进行处理,根据数据包的内容向客户端返回响应的信息。
MINA 框架简介2011-02-12 9:35Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(然,也可以提供JAVA 对象的序列化服务、虚拟机管道通信服务等),Mina 可以帮助我们快速开发高性能、高扩展性的网络通信应用,Mina 提供了事件驱动、异步(Mina 的异步IO 默认使用的是JAVA NIO 作为底层支持)操作的编程模型。
Mina 主要有1.x 和2.x 两个分支,这里我们讲解最新版本2.0,如果你使用的是Mina 1.x,那么可能会有一些功能并不适用。
学习本文档,需要你已掌握JAVA IO、JAVA NIO、JAVASocket、JAVA 线程及并发库(java.util.concurrent.*)的知识。
Mina 同时提供了网络通信的Server 端、Client 端的封装,无论是哪端,Mina 在整个网通通信结构中都处于如下的位置:1。
MINA 框架简介当客户首次访问采用MINA编写的程序时,IoAcceptor作为线程运行,负责接受来自客户的请求。
当有客户请求连接时,创建一个 Session,该Session与IoProcessor、SocketChannel以及IOService联系起来。
IoProcessor也作为另外一个线程运行,定时检查客户是否有数据到来,并对客户请求进行处理,依次调用在IOService注册的各个IoFilter,最后调用 IoHandler进行最终的逻辑处理,再将处理后的结果Filter后返回给客户端。
2。
IoSessionSession可以理解为服务器与客户端的特定连接,该连接由服务器地址、端口以及客户端地址、端口来决定。
客户端发起请求时,指定服务器地址和端口,客户端也会指定或者根据网络路由信息自动指定一个地址、自动分配一个端口。
这个地址、端口对构成一个Session。
MINA2官方教程翻译(1)2.x与1.x的变化文章分类:Java编程一、包与命名所有的类和方法严格使用驼峰法命名。
例如SSLFilter被更名为SslFilter,其它很多类也是如此。
所有NIO传输类在命名时增加‘Nio’前缀。
因为NIO并不只是socket/datagram传输的实现,所有‘Nio’前缀加在了所有的NIO传输类上。
改变之前:Java代码1.SocketAcceptor acceptor=new SocketAcceptor();改变之后:Java代码1.SocketAcceptor acceptor=new NioSocketAcceptor();Filter类被重新整理进多重子包内。
随着框架自带的filter实现的数量的增加,所有的filter都被移动到适当的子包中(例如,StreamWriteFilter移至org.apache.mina.filter.stream)。
*.support的所有包被移动到了其父包(或者其他包)中。
为了避免循环依赖,*.support包中的所有类都被移至其父包或者其他包中。
你可以在IDE(例如Eclipse)中简单的修正这些包的导入从而避免编译错误。
二、BuffersMINA ByteBuffer被重命名为IoBuffer。
因为MINA ByteBuffer与JDK中NIO ByteBuffer同名,很多用户发现与其组员沟通时存在很多困难。
根据用户的反馈,我们将MINA ByteBuffer重命名为IoBuffer,这不仅使类名称简化,也是类名称更加明晰。
放弃Buffer池,默认使用IoBuffer.allocate(int)来分配heap buffer。
•acquire()与release()两个方法将不再是容易发生错误的。
如果你愿意,你可以调用free()方法,但这是可选的。
请自己承担使用这个方法的风险。
•在大多数JVM中,框架内置的IoBuffer性能更加强劲、稳定。
关于Apache Mina一、介绍MINA(Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架。
通过使用MINA框架可以可以省下处理底层I/O和线程并发等复杂工作,开发人员能够把更多的精力投入到业务设计和开发当中。
MINA框架的应用比较广泛,应用的开源项目有Apache Directory、AsyncWeb、Apache Qpid、QuickFIX/J、Openfire、SubEthaSTMP、red5等。
MINA框架的特点有:基于java NIO类库开发;采用非阻塞方式的异步传输;事件驱动;支持批量数据传输;支持TCP、UDP协议;控制反转的设计模式(支持Spring);采用优雅的松耦合架构;可灵活的加载过滤器机制;单元测试更容易实现;可自定义线程的数量,以提高运行于多处理器上的性能;采用回调的方式完成调用,线程的使用更容易。
二、调用过程在图中的模块链中,IoService 便是应用程序的入口,相当于代码中的 IoAccepter,IoAccepter 便是 IoService 的一个扩展接口。
IoService 接口可以用来添加多个 IoFilter,这些 IoFilter 符合责任链模式并由 IoProcessor 线程负责调用。
而 IoAccepter 在 ioService 接口的基础上还提供绑定某个通讯端口以及取消绑定的接口。
在上图中最右端也就是 IoHandler,这便是业务处理模块。
在业务处理类中不需要去关心实际的通讯细节,只管处理客户端传输过来的信息即可。
编写 Handler 类就是使用 MINA 开发网络应用程序的重心所在,相当于 MINA 已经帮你处理了所有的通讯方面的细节问题。
为了简化 Handler 类,MINA 提供了 IoHandlerAdapter 类,此类仅仅是实现了 IoHandler 接口,但并不做任何处理。
IoHandler 接口中具有如下一些方法:Java代码1.public interface IoHandler {2. void sessionCreated(IoSession session) throws Exception;//会话创建3. void sessionOpened(IoSession session) throws Exception;//打开会话,与sessionCreated最大的区别是它是从另一个线程处调用的4. void sessionClosed(IoSession session) throws Exception;//会话结束,当连接关闭时被调用5. void sessionIdle (IoSession session, IdleStatus status) throws Exception;//会话空闲6. void exceptionCaught(IoSession session, Throwable cause) throws Exception;//异常捕获,Mina会自动关闭此连接7. void messageReceived(IoSession session, Object message) throws Exception;//接收到消息8. void messageSent(IoSession session, Object message) throws Exception;//发送消息9.}IoService 是负责底层通讯接入,而 IoHandler 是负责业务处理的。
那么 MINA 架构图中的IoFilter 作何用途呢?答案是你想作何用途都可以。
但是有一个用途却是必须的,那就是作为IoService 和 IoHandler 之间的桥梁。
IoHandler 接口中最重要的一个方法是 messageReceived,这个方法的第二个参数是一个 Object 型的消息,众所周知,Object 是所有 Java 对象的基础,那到底谁来决定这个消息到底是什么类型呢?答案也就在这个 IoFilter 中。
在下面使用的例子中,我们添加了一个 IoFilter 是 new ProtocolCodecFilter(new TextLineCodecFactory()),这个过滤器的作用是将来自客户端输入的信息转换成一行行的文本后传递给 IoHandler,因此我们可以在messageReceived 中直接将 msg 对象强制转换成 String 对象。
而如果我们不提供任何过滤器的话,那么在 messageReceived 方法中的第二个参数类型就是一个 byte 的缓冲区,对应的类是 mon.ByteBuffer。
虽然你也可以将解析客户端信息放在 IoHandler 中来做,但这并不是推荐的做法,使原来清晰的模型又模糊起来,变得IoHandler 不只是业务处理,还得充当协议解析的任务。
MINA自身带有一些常用的过滤器,例如LoggingFilter(日志记录)、BlackListFilter(黑名单过滤)、CompressionFilter(压缩)、SSLFilter(SSL加密)等。
三、使用示例1.服务器端Java代码1.package com.logcd.mina2;2.3.import java.io.IOException;4.import .InetSocketAddress;5.import java.nio.charset.Charset;6.7.import org.apache.mina.core.service.IoAcceptor;8.import org.apache.mina.filter.codec.ProtocolCodecFilter;9.import org.apache.mina.filter.codec.textline.TextLineCodecFactory;10.import org.apache.mina.filter.logging.LoggingFilter;11.import org.apache.mina.transport.socket.nio.NioSocketAcceptor;12.13./**14. * 服务端主程序15. */16.public class MinaServer{17.18. private static final int PORT = 8901;// 定义监听端口19.20. public static void main(String[] args) throws IOException21. {22. // 创建服务端监控线程23. IoAcceptor acceptor = new NioSocketAcceptor();24. // 设置日志记录器25. acceptor.getFilterChain().addLast("logger", new LoggingFilter());26. // 设置编码过滤器27. acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));28. // 指定业务逻辑处理器29. acceptor.setHandler(new ServerHandler());30. // 设置端口号31. acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT));32. // 启动监听线程33. acceptor.bind();34. }35.}Java代码1.package com.logcd.mina2;2.3.import org.apache.mina.core.service.IoHandlerAdapter;4.import org.apache.mina.core.session.IoSession;5.6./**7. * 服务端逻辑控制类8. */9.public class ServerHandler extends IoHandlerAdapter{10.11. @Override12. /**13. * 连接创建事件14. */15. public void sessionCreated(IoSession session)16. {17. // 显示客户端的ip和端口18. System.out.println(session.getRemoteAddress().toString());19. }20.21. @Override22. /**23. * 消息接收事件24. */25. public void messageReceived(IoSession session, Object message) throws Exception26. {27. String str = message.toString();28. if (str.trim().equalsIgnoreCase("quit"))29. {30. // 结束会话31. session.close(true);32. return;33. }34. // 返回消息字符串35. session.write("Hi Client!");36. // 打印客户端传来的消息内容37. System.out.println("Message written..." + str);38. }39.}2.客户端Java代码1.package com.logcd.mina2;2.3.import .InetSocketAddress;4.import java.nio.charset.Charset;5.6.import org.apache.mina.core.future.ConnectFuture;7.import org.apache.mina.filter.codec.ProtocolCodecFilter;8.import org.apache.mina.filter.codec.textline.TextLineCodecFactory;9.import org.apache.mina.filter.logging.LoggingFilter;10.import org.apache.mina.transport.socket.nio.NioSocketConnector;11.12./**13. * 客户端主程序14. */15.public class MinaClient16.{17.18. public static void main(String[] args)19. {20. // 创建客户端连接器.21. NioSocketConnector connector = new NioSocketConnector();22. // 设置日志记录器23. connector.getFilterChain().addLast("logger", new LoggingFilter());24. // 设置编码过滤器25. connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(newTextLineCodecFactory(Charset.forName("UTF-8"))));26. // 设置连接超时检查时间27. connector.setConnectTimeoutCheckInterval(30);28. // 设置事件处理器29. connector.setHandler(new ClientHandler());30. // 建立连接31. ConnectFuture cf = connector.connect(new InetSocketAddress("195.2.199.170", 8901));32. // 等待连接创建完成33. cf.awaitUninterruptibly();34. // 发送消息35. cf.getSession().write("Hi Server!");36. // 发送消息37. cf.getSession().write("quit");38. // 等待连接断开39. cf.getSession().getCloseFuture().awaitUninterruptibly();40. // 释放连接41. connector.dispose();42. }43.}Java代码1.package com.logcd.mina2;2.3.import org.apache.mina.core.service.IoHandlerAdapter;4.import org.apache.mina.core.session.IoSession;5.6./**7. * 客户端逻辑控制类8. */9.public class ClientHandler extends IoHandlerAdapter {10.11. @Override12. /**13. * 消息接收事件14. */15. public void messageReceived(IoSession session, Object message)16. throws Exception {17. System.out.println("server message:" + message.toString());// 显示接收到的消息18. }19.}。