﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-昊天-随笔分类-mina</title><link>http://www.blogjava.net/hao446tian/category/50858.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 12 Jun 2012 23:58:28 GMT</lastBuildDate><pubDate>Tue, 12 Jun 2012 23:58:28 GMT</pubDate><ttl>60</ttl><item><title>Apache MINA实战之 牛刀小试</title><link>http://www.blogjava.net/hao446tian/archive/2012/06/12/380620.html</link><dc:creator>昊天</dc:creator><author>昊天</author><pubDate>Tue, 12 Jun 2012 08:30:00 GMT</pubDate><guid>http://www.blogjava.net/hao446tian/archive/2012/06/12/380620.html</guid><wfw:comment>http://www.blogjava.net/hao446tian/comments/380620.html</wfw:comment><comments>http://www.blogjava.net/hao446tian/archive/2012/06/12/380620.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hao446tian/comments/commentRss/380620.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hao446tian/services/trackbacks/380620.html</trackback:ping><description><![CDATA[<p>Apache的MINA是一个被用来构建高性能和高可伸缩性应用程序的网络应用框架，它提供了一套统一的建立在Java NIO之上的事件驱动的异步API。</p>
<p>对于MINA框架的了解，MINA官方的几篇文章是必须要看的，如下：</p>
<p>* Application Architecture http://mina.apache.org/mina-based-application-architecture.html <br />* Server Architecture http://mina.apache.org/server-architecture.html <br />* Client Architecture http://mina.apache.org/client-architecture.html</p>
<p>其中几个主要的组件如下：</p>
<p>I/O Service - 用来处理I/O流，对于Server端就是IOAcceptor的实现类接受Client端的连接请求，对于Client端就是IoConnector的实现类来建立到Server端的连接。</p>
<p>I/O Filter Chain - 用来过滤或转化数据。对于Server端和Client端来说都是IoFilter接口的实现类，MINA自己内建了很多IoFilter接口的实现类。具体可以参考官方文档。</p>
<p>I/O Handler - 用来处理真正业务逻辑的类。对于Server端和Client端来说都是IoHandler接口的实现类，通常来说需要自己编写。</p>
<p><br /></p>
<p>由于Server端和Client端都是基于以上三个组件的，因此对于Server端和Client端编程来说就都有类似的代码结构。<br /></p>
<p>对于Server端来说： <br /></p>
<p>1. 创建I/O service - 这里就是创建IOAcceptor类监听端口。 <br /></p>
<p>2. 创建I/O Filter Chain - 这里就是告诉使用那些IoFilter。 <br />3. 创建I/O Handler - 自己的业务逻辑。&nbsp; <br /></p>
<p>对于Client端来说： <br /></p>
<p>1. 创建I/O service - 这里就是创建IOConnector类来建立到Server端的连接。 <br /></p>
<p>2. 创建I/O Filter Chain - 这里就是告诉使用那些IoFilter。 <br /></p>
<p>3. 创建I/O Handler - 自己的业务逻辑。<br /></p>
<p>下面来通过一个例子看看MINA是怎样工作的。由于大多数应用都是基于TCP/IP的应用，所以这里也就不再说UDP/IP了。</p>
<p>这里我使用了Maven来创建了一个简单java应用程序，具体步骤请参Maven的官方手册。这里只是将我用到的maven配置文件pom.xml列出，方便下面及后续文章使用。具体pom.xml文件内容如下：</p>
<p>&nbsp;</p>
<div class="dp-highlighter bg_html" sizset="37" sizcache="1">
<div class="bar" sizset="37" sizcache="1">
<div class="tools" sizset="37" sizcache="1"><strong>[html]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/kongxx/article/details/7520259#"><u><font color="#0000ff">view plain</font></u></a><a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/kongxx/article/details/7520259#"><u><font color="#0000ff">copy</font></u></a><a class="PrintSource" title="print" href="http://blog.csdn.net/kongxx/article/details/7520259#"><u><font color="#0000ff">print</font></u></a><a class="About" title="?" href="http://blog.csdn.net/kongxx/article/details/7520259#"><u><font color="#0000ff">?</font></u></a></div></div>
<ol class="dp-xml"><li class="alt"><span class="tag">&lt;</span><span class="tag-name">project</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">"http://maven.apache.org/POM/4.0.0"</span><span>&nbsp;</span><span class="attribute">xmlns:xsi</span><span>=</span><span class="attribute-value">"http://www.w3.org/2001/XMLSchema-instance"</span><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">xsi:schemaLocation</span><span>=</span><span class="attribute-value">"http://maven.apache.org/POM/4.0.0&nbsp;http://maven.apache.org/maven-v4_0_0.xsd"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">modelVersion</span><span class="tag">&gt;</span><span>4.0.0</span><span class="tag">&lt;/</span><span class="tag-name">modelVersion</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">groupId</span><span class="tag">&gt;</span><span>com.google.code.garbagecan.minastudy</span><span class="tag">&lt;/</span><span class="tag-name">groupId</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">artifactId</span><span class="tag">&gt;</span><span>minastudy</span><span class="tag">&lt;/</span><span class="tag-name">artifactId</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">packaging</span><span class="tag">&gt;</span><span>jar</span><span class="tag">&lt;/</span><span class="tag-name">packaging</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">version</span><span class="tag">&gt;</span><span>1.0-SNAPSHOT</span><span class="tag">&lt;/</span><span class="tag-name">version</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>minastudy</span><span class="tag">&lt;/</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">url</span><span class="tag">&gt;</span><span>http://maven.apache.org</span><span class="tag">&lt;/</span><span class="tag-name">url</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">dependencies</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">dependency</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">groupId</span><span class="tag">&gt;</span><span>org.apache.mina</span><span class="tag">&lt;/</span><span class="tag-name">groupId</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">artifactId</span><span class="tag">&gt;</span><span>mina-core</span><span class="tag">&lt;/</span><span class="tag-name">artifactId</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">version</span><span class="tag">&gt;</span><span>2.0.4</span><span class="tag">&lt;/</span><span class="tag-name">version</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">dependency</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">dependency</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">groupId</span><span class="tag">&gt;</span><span>org.apache.mina</span><span class="tag">&lt;/</span><span class="tag-name">groupId</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">artifactId</span><span class="tag">&gt;</span><span>mina-filter-compression</span><span class="tag">&lt;/</span><span class="tag-name">artifactId</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">version</span><span class="tag">&gt;</span><span>2.0.4</span><span class="tag">&lt;/</span><span class="tag-name">version</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">dependency</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">dependency</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">groupId</span><span class="tag">&gt;</span><span>org.slf4j</span><span class="tag">&lt;/</span><span class="tag-name">groupId</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">artifactId</span><span class="tag">&gt;</span><span>slf4j-api</span><span class="tag">&lt;/</span><span class="tag-name">artifactId</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">version</span><span class="tag">&gt;</span><span>1.3.0</span><span class="tag">&lt;/</span><span class="tag-name">version</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">dependency</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">dependency</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">groupId</span><span class="tag">&gt;</span><span>org.slf4j</span><span class="tag">&lt;/</span><span class="tag-name">groupId</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">artifactId</span><span class="tag">&gt;</span><span>slf4j-log4j12</span><span class="tag">&lt;/</span><span class="tag-name">artifactId</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">version</span><span class="tag">&gt;</span><span>1.3.0</span><span class="tag">&lt;/</span><span class="tag-name">version</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">dependency</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">dependencies</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">project</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li></ol></div>首先来看Server端的代码 
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="dp-highlighter bg_java" sizset="41" sizcache="1">
<div class="bar" sizset="41" sizcache="1">
<div class="tools" sizset="41" sizcache="1"><strong>[java]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/kongxx/article/details/7520259#"><u><font color="#0000ff">view plain</font></u></a><a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/kongxx/article/details/7520259#"><u><font color="#0000ff">copy</font></u></a><a class="PrintSource" title="print" href="http://blog.csdn.net/kongxx/article/details/7520259#"><u><font color="#0000ff">print</font></u></a><a class="About" title="?" href="http://blog.csdn.net/kongxx/article/details/7520259#"><u><font color="#0000ff">?</font></u></a></div></div>
<ol class="dp-j"><li class="alt"><span class="keyword">package</span><span>&nbsp;com.google.code.garbagecan.minastudy.sample1;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.IOException;&nbsp;&nbsp;</span></span></li><li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.net.InetSocketAddress;&nbsp;&nbsp;</span></span></li><li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.nio.charset.Charset;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.core.service.IoAcceptor;&nbsp;&nbsp;</span></span></li><li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.core.service.IoHandlerAdapter;&nbsp;&nbsp;</span></span></li><li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.core.session.IdleStatus;&nbsp;&nbsp;</span></span></li><li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.core.session.IoSession;&nbsp;&nbsp;</span></span></li><li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.filter.codec.ProtocolCodecFilter;&nbsp;&nbsp;</span></span></li><li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.filter.codec.textline.TextLineCodecFactory;&nbsp;&nbsp;</span></span></li><li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.filter.logging.LoggingFilter;&nbsp;&nbsp;</span></span></li><li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.transport.socket.nio.NioSocketAcceptor;&nbsp;&nbsp;</span></span></li><li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.slf4j.Logger;&nbsp;&nbsp;</span></span></li><li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.slf4j.LoggerFactory;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MyServer&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;Logger&nbsp;logger&nbsp;=&nbsp;LoggerFactory.getLogger(MyServer.</span><span class="keyword">class</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IoAcceptor&nbsp;acceptor&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;NioSocketAcceptor();&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acceptor.getFilterChain().addLast(</span><span class="string">"logger"</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;LoggingFilter());&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acceptor.getFilterChain().addLast(</span><span class="string">"codec"</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;ProtocolCodecFilter(</span><span class="keyword">new</span><span>&nbsp;TextLineCodecFactory(Charset.forName(</span><span class="string">"UTF-8"</span><span>))));&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acceptor.setHandler(</span><span class="keyword">new</span><span>&nbsp;IoHandlerAdapter()&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;sessionCreated(IoSession&nbsp;session)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;sessionOpened(IoSession&nbsp;session)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;sessionClosed(IoSession&nbsp;session)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;sessionIdle(IoSession&nbsp;session,&nbsp;IdleStatus&nbsp;status)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;exceptionCaught(IoSession&nbsp;session,&nbsp;Throwable&nbsp;cause)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(cause.getMessage(),&nbsp;cause);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close(</span><span class="keyword">true</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;messageReceived(IoSession&nbsp;session,&nbsp;Object&nbsp;message)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</span><span class="string">"Received&nbsp;message&nbsp;"</span><span>&nbsp;+&nbsp;message);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.write(message);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;messageSent(IoSession&nbsp;session,&nbsp;Object&nbsp;message)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</span><span class="string">"Sent&nbsp;message&nbsp;"</span><span>&nbsp;+&nbsp;message);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acceptor.bind(</span><span class="keyword">new</span><span>&nbsp;InetSocketAddress(</span><span class="number">10000</span><span>));&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;ex)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(ex.getMessage(),&nbsp;ex);&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>}&nbsp;&nbsp;</span></li></ol></div>1. 首先创建I/O Service，这里使用的是NioSocketAcceptor类来创建了一个IoAcceptor实例。 <br />
<p>&nbsp;</p>
<p>2. 创建I/O Filter Chain，这里使用了两个IoFilter，一个是LoggingFilter用来记录日志和打印事件消息，另一个是ProtocolCodecFilter实例用来编码数据，这里其实就是将传递的数据编码成文本。 <br /></p>
<p>3. 创建I/O Handler，不要害怕，看起来代码多，其实就是一个实现了IoHandler接口的子类，自己需要实现其中的一些方法，这里方法比较多，但是我在这里只实现了messageSent，messageReceived和exceptionCaught方法。 <br /></p>
<p>4. 最后就是让IoAcceptor类实例绑定端口实现监听。<br /></p>
<p>下面看看Client端的代码</p>
<div class="dp-highlighter bg_java" sizset="45" sizcache="1">
<div class="bar" sizset="45" sizcache="1">
<div class="tools" sizset="45" sizcache="1"><strong>[java]</strong> <a class="ViewSource" title="view plain" href="http://blog.csdn.net/kongxx/article/details/7520259#"><u><font color="#0000ff">view plain</font></u></a><a class="CopyToClipboard" title="copy" href="http://blog.csdn.net/kongxx/article/details/7520259#"><u><font color="#0000ff">copy</font></u></a><a class="PrintSource" title="print" href="http://blog.csdn.net/kongxx/article/details/7520259#"><u><font color="#0000ff">print</font></u></a><a class="About" title="?" href="http://blog.csdn.net/kongxx/article/details/7520259#"><u><font color="#0000ff">?</font></u></a></div></div>
<ol class="dp-j"><li class="alt"><span class="keyword">package</span><span>&nbsp;com.google.code.garbagecan.minastudy.sample1;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.net.InetSocketAddress;&nbsp;&nbsp;</span></span></li><li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.nio.charset.Charset;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.core.RuntimeIoException;&nbsp;&nbsp;</span></span></li><li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.core.future.ConnectFuture;&nbsp;&nbsp;</span></span></li><li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.core.service.IoConnector;&nbsp;&nbsp;</span></span></li><li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.core.service.IoHandlerAdapter;&nbsp;&nbsp;</span></span></li><li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.core.session.IdleStatus;&nbsp;&nbsp;</span></span></li><li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.core.session.IoSession;&nbsp;&nbsp;</span></span></li><li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.filter.codec.ProtocolCodecFilter;&nbsp;&nbsp;</span></span></li><li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.filter.codec.textline.TextLineCodecFactory;&nbsp;&nbsp;</span></span></li><li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.filter.logging.LoggingFilter;&nbsp;&nbsp;</span></span></li><li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.apache.mina.transport.socket.nio.NioSocketConnector;&nbsp;&nbsp;</span></span></li><li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.slf4j.Logger;&nbsp;&nbsp;</span></span></li><li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.slf4j.LoggerFactory;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MyClient&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;Logger&nbsp;logger&nbsp;=&nbsp;LoggerFactory.getLogger(MyClient.</span><span class="keyword">class</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IoConnector&nbsp;connector&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;NioSocketConnector();&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connector.setConnectTimeoutMillis(</span><span class="number">10</span><span>&nbsp;*&nbsp;</span><span class="number">1000</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connector.getFilterChain().addLast(</span><span class="string">"logger"</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;LoggingFilter());&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connector.getFilterChain().addLast(</span><span class="string">"codec"</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;ProtocolCodecFilter(</span><span class="keyword">new</span><span>&nbsp;TextLineCodecFactory(Charset.forName(</span><span class="string">"UTF-8"</span><span>))));&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connector.setHandler(</span><span class="keyword">new</span><span>&nbsp;IoHandlerAdapter()&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;sessionCreated(IoSession&nbsp;session)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;sessionOpened(IoSession&nbsp;session)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;</span><span class="number">10</span><span>;&nbsp;i++)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.write(</span><span class="string">"Hello&nbsp;user_"</span><span>&nbsp;+&nbsp;i);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.write(</span><span class="string">"Bye"</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;sessionClosed(IoSession&nbsp;session)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;sessionIdle(IoSession&nbsp;session,&nbsp;IdleStatus&nbsp;status)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;exceptionCaught(IoSession&nbsp;session,&nbsp;Throwable&nbsp;cause)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(cause.getMessage(),&nbsp;cause);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close(</span><span class="keyword">true</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;messageReceived(IoSession&nbsp;session,&nbsp;Object&nbsp;message)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</span><span class="string">"Received&nbsp;message&nbsp;"</span><span>&nbsp;+&nbsp;message);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(message.toString().equalsIgnoreCase(</span><span class="string">"Bye"</span><span>))&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close(</span><span class="keyword">true</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;messageSent(IoSession&nbsp;session,&nbsp;Object&nbsp;message)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</span><span class="string">"Sent&nbsp;message&nbsp;"</span><span>&nbsp;+&nbsp;message);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IoSession&nbsp;session&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConnectFuture&nbsp;future&nbsp;=&nbsp;connector.connect(</span><span class="keyword">new</span><span>&nbsp;InetSocketAddress(</span><span class="string">"localhost"</span><span>,&nbsp;</span><span class="number">10000</span><span>));&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;future.awaitUninterruptibly();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session&nbsp;=&nbsp;future.getSession();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(RuntimeIoException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(e.getMessage(),&nbsp;e);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.getCloseFuture().awaitUninterruptibly();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connector.dispose();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>}&nbsp;&nbsp;</span></li></ol></div><br />
<p>1. 首先创建I/O Service，这里使用的是NioSocketConnector类来创建了一个IoConnector实例，并设置连接超时为10秒。 <br /></p>
<p>2. 创建I/O Filter Chain，和服务器端同样设置了两个IoFilter，一个是LoggingFilter用来记录日志和打印事件消息，另一个是ProtocolCodecFilter实例用来编码数据，这里其实就是将传递的数据编码成文本。<br /></p>
<p>3. 创建I/O Handler，也不要害怕，看起来代码多，其实也是一个实现了IoHandler接口的子类，并且自己实现了sessionOpened，messageSent，messageReceived和exceptionCaught方法。实现sessionOpened方法是为了在建立连接后向Server端发送消息。另外看一下messageReceived方法实现，在接收到服务器端的消息后关闭会话。从而可以使Client程序最终能够退出。 <br /></p>
<p>4. 最后就是IoConnector实例类连接远端的Server。 <br /></p>
<p>&nbsp;</p>
<p>下面测试一下上面的程序，首先运行MyServer类，然后运行MyClient类，就可以分别在各自的终端上看到事件日志以及发送/接收的消息了。</p><img src ="http://www.blogjava.net/hao446tian/aggbug/380620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hao446tian/" target="_blank">昊天</a> 2012-06-12 16:30 <a href="http://www.blogjava.net/hao446tian/archive/2012/06/12/380620.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jva NIO框架 Apache Mina 2.x 简易入门解析</title><link>http://www.blogjava.net/hao446tian/archive/2012/02/14/369973.html</link><dc:creator>昊天</dc:creator><author>昊天</author><pubDate>Tue, 14 Feb 2012 10:42:00 GMT</pubDate><guid>http://www.blogjava.net/hao446tian/archive/2012/02/14/369973.html</guid><wfw:comment>http://www.blogjava.net/hao446tian/comments/369973.html</wfw:comment><comments>http://www.blogjava.net/hao446tian/archive/2012/02/14/369973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hao446tian/comments/commentRss/369973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hao446tian/services/trackbacks/369973.html</trackback:ping><description><![CDATA[最近使用Mina开发一个Java的NIO服务端程序，因此也特意学习了Apache的这个Mina框架。 
<p>　　首先，Mina是个什么东西？看下官方网站（http://mina.apache.org/）对它的解释：</p>
<p>　　Apache的Mina（Multipurpose Infrastructure Networked Applications）是一个网络应用框架，可以帮助用户开发高性能和高扩展性的网络应用程序；它提供了一个抽象的、事件驱动的异步API，使Java NIO在各种传输协议（如TCP/IP，UDP/IP协议等）下快速高效开发。</p>
<p>　　Apache Mina也称为：</p>
<ul style="list-style-type: circle"><li>NIO框架</li><li>客户端/服务端框架（典型的C/S架构）</li><li>网络套接字（networking socket）类库</li><li>事件驱动的异步API(注意：在JDK7中也新增了异步API) </li></ul>
<p>总之：我们简单理解它是一个封装底层IO操作，提供高级操作API的通讯框架！</p>
<p>&nbsp;</p>
<p>在Mina的官网、以及网上都有比较丰富的文档了，这里我就稍微简单说一下Mina的结构和示例代码。</p>
<p>因为Mina2.X改进了Mina的代码结构和包结构，降低了使用的复杂性和增强了健壮性，所以使得API发生了比较大的改变，有许多地方已经和Mina1.x不兼容了。</p>
<p><strong>这里使用的是Mina2.0.4</strong></p>
<p><strong>1.Mina的结构</strong></p>
<p><img alt="" src="http://pic002.cnblogs.com/images/2012/312351/2012020811080354.png" /></p>
<p>&nbsp;</p>
<p>Mina的通信流程大致如上图所示，各个组件功能有：<br />(1.)&nbsp; IoService：<strong>这个接口在一个线程上负责套接字的建立</strong>，拥有自己的Selector，监<br />听是否有连接被建立。</p>
<p>（Mina底层使用JAVA NIO， 因此它是典型的使用Reactor模式架构的,采用事件驱动编程 , Mina运行用户自定义线程模型，可以是单线程、多线程、线程池等 ,</p>
<p>&nbsp;&nbsp; 跟JAVA Socket不一样， Mina是非阻塞的Socket，它内部已经保证了对各个连接(session)的业务和数据的隔离，采用轮询机制为各个session分配CPU资源，</p>
<p>　　所以，你就不需要再去考虑不同Socket连接需要用不同的线程去操纵的问题了。)</p>
<p>(2.)&nbsp; IoProcessor：<strong>这个接口在另一个线程上负责检查是否有数据在通道上读写</strong>，也就是<br />说它也拥有自己的Selector，这是与我们使用JAVA NIO 编码时的一个不同之处，<br />通常在JAVA NIO 编码中，我们都是使用一个Selector，也就是不区分IoService<br />与 IoProcessor 两个功能接口。另外，IoProcessor 负责调用注册在IoService 上<br />的过滤器，并在过滤器链之后调用IoHandler。</p>
<p><br />(3.)&nbsp; IoFilter：这个接口定义一组拦截器，这些拦截器可以包括日志输出、黑名单过滤、<br />数据的编码（write 方向）与解码（read 方向）等功能，其中数据的encode 与 decode<br />是最为重要的、也是你在使用Mina 时最主要关注的地方。</p>
<p><br />(4.)&nbsp; IoHandler：这个接口负责编写业务逻辑，也就是接收、发送数据的地方。 <br />&nbsp;</p>
<p><strong>2. Mina编程的大致过程.</strong></p>
<p><strong></strong>&nbsp;&nbsp;&nbsp;<strong> 2.1 总体流程</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 建立服务器端的资源： 包括 Acceptor的建立，之后为Acceptor配置相应的Filter(可以是Mina自带的Filter或者自定义的Filter），</p>
<p>之后再配置相应基于事件驱动的处理业务逻辑的IoHandler.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 建立客户端的资源： Mina采用了统一的编程模型，所以建立客户端的过程和建立服务器端的过程大致上是相似的，不过这里建立的是Connector.</p>
<p>&nbsp;&nbsp;<strong> 2.2 示例程序。(使用jar包为&nbsp;mina-core-2.0.4.jar）</strong></p>
<p>&nbsp;&nbsp;&nbsp; 　　下面通过一个简单的示例程序来进一步理解Mina的运行机制。</p>
<p>&nbsp;　　　　该程序实现简单的即时通讯功能。 即，多个客户端可以同时脸上服务器，并进行类似于聊天室一样的通信。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>2.2.1 建立自定义的TextLineCodecFacotry</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了了解Mina的代码功能以及运行机制，我们模拟实现了类似Mina自带TextLineCodecFactory。</p>
<p>　　　　该CodecFactory功能是： 配合ProtocolCodecFilter 进行对底层数据(binary二进制数据流)和高层数据(特定类型的数据对象信息，例如String)之间的转换。</p>
<p>　　　　　　　　　　　　　　　　这里实现了一个断行读取功能，即遇到'\n'的时候，就认为是一个String Line ， 将这段数据流封装成String，之后再交给下一个Filter或者Handler处理。</p>
<p>　　　　　　　　　　　　　　　　CodecFactory是一个<strong>工厂方法</strong>，底层通过一个<strong>Decoder和Encoder</strong>来提供对数据进行解、编码的操作,<strong>载体是IoBuffer</strong>。</p>
<p>　　　　　　　　　　　　　　　　（<strong>解码</strong>：将二进制数据转换成高层数据(对象)　　　　<strong>编码</strong>：将高层数据(对象)转换成二进制数据流)&nbsp; )</p>
<p>　　　　 1）建立Decoder (MyTextLineDecoder)</p>
<p>　　　　　　实现了ProtocolDecoder接口</p>
<div class="cnblogs_code">
<div class="cnblogs_code_hide" id="cnblogs_code_open_8923e2b9-6b91-447c-baf5-b4f030fd085e"><pre><span style="color: #0000ff">package</span> com.mai.mina.diyCodecFilter;<br /><br /><span style="color: #0000ff">import</span> java.nio.charset.Charset;<br /><br /><span style="color: #0000ff">import</span> org.apache.mina.core.buffer.IoBuffer;<br /><span style="color: #0000ff">import</span> org.apache.mina.core.session.IoSession;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.codec.ProtocolDecoder;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.codec.ProtocolDecoderOutput;<br /><br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> MyTextLineDecoder <span style="color: #0000ff">implements</span> ProtocolDecoder{<br /><br />    Charset charset = Charset.forName("UTF-8");<br />    IoBuffer buf = IoBuffer.allocate(100).setAutoExpand(<span style="color: #0000ff">true</span>);<br />    <br />    @Override<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> decode(IoSession session, IoBuffer in, ProtocolDecoderOutput output)<br />            <span style="color: #0000ff">throws</span> Exception {<br />        <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span><span style="color: #008000"><br /></span>        <span style="color: #0000ff">while</span>(in.hasRemaining()){<br />            <span style="color: #0000ff">byte</span> b = in.get();<br />            <span style="color: #0000ff">if</span>(b == '\n'){<br />                buf.flip();<br />                <span style="color: #0000ff">byte</span>[] bytes = <span style="color: #0000ff">new</span> <span style="color: #0000ff">byte</span>[buf.limit()];<br />                buf.get(bytes);<br />                String message = <span style="color: #0000ff">new</span> String(bytes,charset);<br />                buf = IoBuffer.allocate(100).setAutoExpand(<span style="color: #0000ff">true</span>);<br />                <br />                output.write(message);<br />            }<span style="color: #0000ff">else</span>{<br />                buf.put(b);<br />            }<br />        }<br />    }<br /><br />    @Override<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> dispose(IoSession arg0) <span style="color: #0000ff">throws</span> Exception {<br />        <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span><span style="color: #008000"><br /></span>        <br />    }<br /><br />    @Override<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> finishDecode(IoSession arg0, ProtocolDecoderOutput arg1)<br />            <span style="color: #0000ff">throws</span> Exception {<br />        <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span><span style="color: #008000"><br /></span>        <br />    }<br /><br />}</pre></div></div>
<p>　　　　2）建立Encoder （MyTextLineEncoder)</p>
<p>　　　　　　实现了ProtocolEncoder接口</p>
<div class="cnblogs_code">
<div class="cnblogs_code_hide" id="cnblogs_code_open_cfa5085b-ccbe-4c09-af99-c062a6db7d76"><pre><span style="color: #0000ff">package</span> com.mai.mina.diyCodecFilter;<br /><br /><span style="color: #0000ff">import</span> java.nio.charset.Charset;<br /><br /><span style="color: #0000ff">import</span> org.apache.mina.core.buffer.IoBuffer;<br /><span style="color: #0000ff">import</span> org.apache.mina.core.session.IoSession;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.codec.ProtocolEncoder;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.codec.ProtocolEncoderOutput;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.codec.textline.LineDelimiter;<br /><br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> MyTextLineEncoder <span style="color: #0000ff">implements</span> ProtocolEncoder{<br /><br />    Charset charset = Charset.forName("UTF-8");<br />    <br />    @Override<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> dispose(IoSession session) <span style="color: #0000ff">throws</span> Exception {<br />        <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span><span style="color: #008000"><br /></span>        <br />    }<br /><br />    @Override<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> encode(IoSession session, Object message, ProtocolEncoderOutput output)<br />            <span style="color: #0000ff">throws</span> Exception {<br />        <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span><span style="color: #008000"><br /></span>        IoBuffer buf = IoBuffer.allocate(100).setAutoExpand(<span style="color: #0000ff">true</span>);<br />        <br />        buf.putString(message.toString(), charset.newEncoder());<br />        <br />        buf.putString(LineDelimiter.DEFAULT.getValue(), charset.newEncoder());<br />        buf.flip();<br />        <br />        output.write(buf);<br />        <br />    }<br /><br />}</pre></div></div>
<p>　　　　3）建立MyTextLineCodecFactory</p>
<p>　　　　　　实现了ProtocolCodecFactory接口</p>
<div class="cnblogs_code"><pre><span style="color: #0000ff">package</span> com.mai.mina.diyCodecFilter;<br /><br /><span style="color: #0000ff">import</span> org.apache.mina.core.session.IoSession;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.codec.ProtocolCodecFactory;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.codec.ProtocolDecoder;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.codec.ProtocolEncoder;<br /><br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> MyTextLineCodecFactory <span style="color: #0000ff">implements</span> ProtocolCodecFactory{<br /><br />    @Override<br />    <span style="color: #0000ff">public</span> ProtocolDecoder getDecoder(IoSession arg0) <span style="color: #0000ff">throws</span> Exception {<br />        <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span><span style="color: #008000"><br /></span>        <span style="color: #0000ff">return</span> <span style="color: #0000ff">new</span> MyTextLineDecoder();<br />    }<br /><br />    @Override<br />    <span style="color: #0000ff">public</span> ProtocolEncoder getEncoder(IoSession arg0) <span style="color: #0000ff">throws</span> Exception {<br />        <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span><span style="color: #008000"><br /></span>        <span style="color: #0000ff">return</span> <span style="color: #0000ff">new</span> MyTextLineEncoder();<br />    }<br /><br />}</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a href="javascript:void(0);">复制代码</a></span></div></div>
<p><br />　　<strong>2.2.2 建立服务器端资源（包括Acceptor的配置、Handler建立)</strong></p>
<p><strong></strong>　　　　1). <strong>建立自定义IoHandler（MyServerHandleDemo1)</strong></p>
<p><strong></strong>　　　　　　实现了IoHandler接口。</p>
<p>　</p><pre><span style="color: #0000ff">package</span> com.mai.mina.diyChat;<br /><br /><span style="color: #0000ff">import</span> java.text.DateFormat;<br /><span style="color: #0000ff">import</span> java.text.SimpleDateFormat;<br /><span style="color: #0000ff">import</span> java.util.Collection;<br /><span style="color: #0000ff">import</span> java.util.Date;<br /><span style="color: #0000ff">import</span> java.util.logging.Logger;<br /><br /><span style="color: #0000ff">import</span> org.apache.mina.core.future.CloseFuture;<br /><span style="color: #0000ff">import</span> org.apache.mina.core.future.IoFuture;<br /><span style="color: #0000ff">import</span> org.apache.mina.core.future.IoFutureListener;<br /><span style="color: #0000ff">import</span> org.apache.mina.core.service.IoHandler;<br /><span style="color: #0000ff">import</span> org.apache.mina.core.session.IdleStatus;<br /><span style="color: #0000ff">import</span> org.apache.mina.core.session.IoSession;<br /><br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> MyServerHandleDemo1 <span style="color: #0000ff">implements</span> IoHandler{<br /><br />    <span style="color: #0000ff">private</span> Logger logger = Logger.getLogger(<span style="color: #0000ff">this</span>.getClass().getName());<br />    <br />    @Override<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> exceptionCaught(IoSession session, Throwable arg1)<br />            <span style="color: #0000ff">throws</span> Exception {<br />        <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span><span style="color: #008000"><br /></span>        logger.warning("服务器启动发生异常，have a exception : " + arg1.getMessage());<br />    }<br /><br />    @Override<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> messageReceived(IoSession session, Object message) <span style="color: #0000ff">throws</span> Exception {<br />        <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span><span style="color: #008000"><br /></span>        String messageStr = message.toString();<br />        DateFormat format = <span style="color: #0000ff">new</span> SimpleDateFormat("yyyy-MM-dd H:m:s");<br />        String dateStr = format.format(<span style="color: #0000ff">new</span> Date());<br />        <br />        logger.info(messageStr + "\t" + dateStr);<br />        <br />        Collection&lt;IoSession&gt; sessions = session.getService().getManagedSessions().values();<br />        <span style="color: #0000ff">for</span>(IoSession tempSession : sessions){<br />            tempSession.write(messageStr + "\t" + dateStr);<br />        }<br />    }<br /><br />    @Override<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> messageSent(IoSession session, Object message) <span style="color: #0000ff">throws</span> Exception {<br />        <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span><span style="color: #008000"><br /></span>        logger.info("服务器成功发送信息: " + message.toString());<br />    }<br /><br />    @Override<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> sessionClosed(IoSession session) <span style="color: #0000ff">throws</span> Exception {<br />        <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span><span style="color: #008000"><br /></span>        logger.info("there is a session closed");<br />        CloseFuture future = session.close(<span style="color: #0000ff">true</span>);<br />        future.addListener(<span style="color: #0000ff">new</span> IoFutureListener(){<br />            <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> operationComplete(IoFuture future){<br />                <span style="color: #0000ff">if</span>(future <span style="color: #0000ff">instanceof</span> CloseFuture){<br />                    ((CloseFuture)future).setClosed();<br />                    logger.info("have do the future set to closed");<br />                }<br />            }<br />        });<br />    }<br /><br />    @Override<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> sessionCreated(IoSession session) <span style="color: #0000ff">throws</span> Exception {<br />        <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span><span style="color: #008000"><br /></span>        logger.info("there is a session created");<br />        session.write("welcome to the chat room");<br />    }<br /><br />    @Override<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> sessionIdle(IoSession session, IdleStatus arg1) <span style="color: #0000ff">throws</span> Exception {<br />        <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span><span style="color: #008000"><br /></span>        logger.info(session.getId() + "(SesssionID) is idle in the satate--&gt;" + arg1);<br />    }<br /><br />    @Override<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> sessionOpened(IoSession arg0) <span style="color: #0000ff">throws</span> Exception {<br />        <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span><span style="color: #008000"><br /></span>        <br />    }<br /><br />    <br />}　</pre>
<div class="cnblogs_code">
<div class="cnblogs_code_hide" id="cnblogs_code_open_c1fa55ee-0260-49e1-a90c-85a7595a7e4a" style="display: none" jquery17004058656685155537="1">&nbsp;</div><pre></pre>　　　　2).建立Acceptor ，同时也充当Server端的启动类 (SimpleMinaServer)</div>
<div class="cnblogs_code"><pre><span style="color: #0000ff">package</span> com.mai.mina.diyChat;<br /><br /><span style="color: #0000ff">import</span> java.io.IOException;<br /><span style="color: #0000ff">import</span> java.net.InetSocketAddress;<br /><span style="color: #0000ff">import</span> java.nio.charset.Charset;<br /><br /><span style="color: #0000ff">import</span> org.apache.mina.core.session.IdleStatus;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.codec.ProtocolCodecFilter;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.codec.textline.LineDelimiter;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.codec.textline.TextLineCodecFactory;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.logging.LogLevel;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.logging.LoggingFilter;<br /><span style="color: #0000ff">import</span> org.apache.mina.transport.socket.SocketAcceptor;<br /><span style="color: #0000ff">import</span> org.apache.mina.transport.socket.nio.NioSocketAcceptor;<br /><br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> SimpleMinaServer {<br />    <br />    SocketAcceptor acceptor = <span style="color: #0000ff">null</span>;<br />    <br />    SimpleMinaServer(){<br />        acceptor = <span style="color: #0000ff">new</span> NioSocketAcceptor();<br />    }<br />    <br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">boolean</span> bind(){<br />        acceptor.getFilterChain().addLast("codec", <span style="color: #0000ff">new</span> ProtocolCodecFilter(<br />                <span style="color: #0000ff">new</span> MyTextLineCodecFactory()); //配置CodecFactory<br />        LoggingFilter log = <span style="color: #0000ff">new</span> LoggingFilter();<br />        log.setMessageReceivedLogLevel(LogLevel.INFO);<br />        acceptor.getFilterChain().addLast("logger", log);<br />        acceptor.setHandler(<span style="color: #0000ff">new</span> MyServerHandleDemo1());　　//配置handler<br />        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 30);<br />        <br />        <span style="color: #0000ff">try</span> {<br />            acceptor.bind(<span style="color: #0000ff">new</span> InetSocketAddress(8888));<br />            <span style="color: #0000ff">return</span> <span style="color: #0000ff">true</span>;<br />        } <span style="color: #0000ff">catch</span> (IOException e) {<br />            <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated catch block</span><span style="color: #008000"><br /></span>            e.printStackTrace();<br />            <span style="color: #0000ff">return</span> <span style="color: #0000ff">false</span>;<br />        }<br />        <br />    }<br />    <br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> main(String args[]){<br />        SimpleMinaServer server = <span style="color: #0000ff">new</span> SimpleMinaServer();<br />        <span style="color: #0000ff">if</span>(!server.bind()){<br />            System.out.println("服务器启动失败");<br />        }<span style="color: #0000ff">else</span>{<br />            System.out.println("服务器启动成功");<br />        }<br />    }<br /><br />}</pre><br />　　<strong>2.2.3 建立Client端资源：</strong></div>
<p><strong></strong>　　　　1）自定义IoHandler(MyClientHandleDemo1)</p>
<p>　　　　　　实现IoHandler接口</p>
<div class="cnblogs_code">
<div class="cnblogs_code_hide" id="cnblogs_code_open_1184733a-aad5-44dd-a300-a72ec56de88e"><pre><span style="color: #0000ff">package</span> com.mai.mina.diyChat;<br /><br /><span style="color: #0000ff">import</span> java.util.logging.Logger;<br /><br /><span style="color: #0000ff">import</span> org.apache.mina.core.service.IoHandlerAdapter;<br /><span style="color: #0000ff">import</span> org.apache.mina.core.session.IoSession;<br /><br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> MyClientHandleDemo1 <span style="color: #0000ff">extends</span> IoHandlerAdapter{<br />    <span style="color: #0000ff">private</span> ChatPanel messagePanel = <span style="color: #0000ff">null</span>;<br />    <span style="color: #0000ff">private</span> Logger logger = Logger.getLogger(<span style="color: #0000ff">this</span>.getClass().getName());<br /><br />    MyClientHandleDemo1(){<br />        <br />    }<br />    <br />    MyClientHandleDemo1(ChatPanel messagePanel){<br />        <span style="color: #0000ff">this</span>.messagePanel = messagePanel;<br />    }<br />    <br />    <br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> messageReceived(IoSession session, Object message) <span style="color: #0000ff">throws</span> Exception {<br />        <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span><span style="color: #008000"><br /></span>        String messageStr = message.toString();<br />        logger.info("receive a message is : " + messageStr);<br />        <br />        <span style="color: #0000ff">if</span>(messagePanel != <span style="color: #0000ff">null</span>)<br />        messagePanel.showMsg(messageStr);<br />    }<br />    <br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> messageSent(IoSession session , Object message) <span style="color: #0000ff">throws</span> Exception{<br />        logger.info("客户端发了一个信息：" + message.toString());<br />    }<br />    <br />}</pre></div></div>
<p>　　　　2) 建立Connector<strong>&nbsp; (SimpleMinaClient)</strong></p>
<p>　</p>
<div class="cnblogs_code"><img class="code_img_closed" id="code_img_closed_47a44f83-a089-4bde-9546-fa8c048d19e1" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img class="code_img_opened" id="code_img_opened_47a44f83-a089-4bde-9546-fa8c048d19e1" style="display: none" alt="" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" /><span class="cnblogs_code_collapse">View Code </span>
<div class="cnblogs_code_hide" id="cnblogs_code_open_47a44f83-a089-4bde-9546-fa8c048d19e1"><pre><span style="color: #0000ff">package</span> com.mai.mina.diyChat;<br /><br /><span style="color: #0000ff">import</span> java.net.InetSocketAddress;<br /><span style="color: #0000ff">import</span> java.nio.charset.Charset;<br /><br /><span style="color: #0000ff">import</span> org.apache.mina.core.future.CloseFuture;<br /><span style="color: #0000ff">import</span> org.apache.mina.core.future.ConnectFuture;<br /><span style="color: #0000ff">import</span> org.apache.mina.core.session.IoSession;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.codec.ProtocolCodecFilter;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.codec.textline.LineDelimiter;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.codec.textline.TextLineCodecFactory;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.logging.LogLevel;<br /><span style="color: #0000ff">import</span> org.apache.mina.filter.logging.LoggingFilter;<br /><span style="color: #0000ff">import</span> org.apache.mina.transport.socket.SocketConnector;<br /><span style="color: #0000ff">import</span> org.apache.mina.transport.socket.nio.NioSocketConnector;<br /><br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> SimpleMinaClient {<br /><br />    <span style="color: #0000ff">public</span> SocketConnector connector = <span style="color: #0000ff">null</span>;<br />    <span style="color: #0000ff">public</span> ConnectFuture future;<br />    <span style="color: #0000ff">public</span> IoSession session = <span style="color: #0000ff">null</span>;<br />    <span style="color: #0000ff">private</span> ChatPanel messagePanel = <span style="color: #0000ff">null</span>;<br />    <br />    SimpleMinaClient(){<br />        <br />    }<br />    <br />    SimpleMinaClient(ChatPanel messagePanel){<br />        <span style="color: #0000ff">this</span>.messagePanel = messagePanel;<br />    }<br />    <br />    <br />    <span style="color: #0000ff">boolean</span> connect(){<br />        <span style="color: #0000ff">try</span>{<br />            connector = <span style="color: #0000ff">new</span> NioSocketConnector();<br />            connector.setConnectTimeoutMillis(3000);<br />            connector.getFilterChain().addLast("codec", <span style="color: #0000ff">new</span> ProtocolCodecFilter(<br />                <span style="color: #0000ff">new</span> MyTextLineCodecFactory());<br />            LoggingFilter log = <span style="color: #0000ff">new</span> LoggingFilter();<br />            log.setMessageReceivedLogLevel(LogLevel.INFO);<br />            connector.getFilterChain().addLast("logger", log);<br />            connector.setHandler(<span style="color: #0000ff">new</span> MyClientHandleDemo1(messagePanel));<br />            <br />            future = connector.connect(<span style="color: #0000ff">new</span> InetSocketAddress("127.0.0.1" , 8888));<br />            future.awaitUninterruptibly();<br />            session = future.getSession();<br />            <span style="color: #0000ff">return</span> <span style="color: #0000ff">true</span>;<br />        }<span style="color: #0000ff">catch</span>(Exception e){<br />            e.printStackTrace();<br />            <span style="color: #0000ff">return</span> <span style="color: #0000ff">false</span>;<br />        }<br />        <br />    }<br />    <br />    <br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> setAttribute(Object key , Object value){<br />        session.setAttribute(key, value);<br />    }<br />    <br />    <br />    <span style="color: #0000ff">void</span> sentMsg(String message){<br />        session.write(message);<br />    }<br />    <br />    <br />    <span style="color: #0000ff">boolean</span> close(){<br />        CloseFuture future = session.getCloseFuture();<br />        future.awaitUninterruptibly(1000);<br />        connector.dispose();<br />        <span style="color: #0000ff">return</span> <span style="color: #0000ff">true</span>;<br />    }<br />    <br />    <span style="color: #0000ff">public</span> SocketConnector getConnector() {<br />        <span style="color: #0000ff">return</span> connector;<br />    }<br /><br />    <span style="color: #0000ff">public</span> IoSession getSession() {<br />        <span style="color: #0000ff">return</span> session;<br />    }<br /><br />    <span style="color: #008000">/**</span><span style="color: #008000"><br />     * </span><span style="color: #808080">@param</span><span style="color: #008000"> args<br />     </span><span style="color: #008000">*/</span><br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> main(String[] args) {<br />        <span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub</span><span style="color: #008000"><br /></span>        SimpleMinaClient client = <span style="color: #0000ff">new</span> SimpleMinaClient();<br />        <span style="color: #0000ff">if</span>(client.connect()){<br />            client.sentMsg("hello , sever !");<br />            client.close();<br />        }<br />        <br />    }<br /><br />}</pre></div></div>
<p>　　<strong>到这里，基本的Mina通信基础就建立好了。</strong></p>
<p><strong></strong>　　接下来实现一个客户端的GUI界面，方便实际功能的建立和信息交互的演示。</p>
<p>&nbsp;</p>
<p>　　<strong>2.2.4 Client Gui界面的建立。(ChatPanel -通过使用SimpleMinaClient来提供实际通信功能)</strong></p>
<div class="cnblogs_code"><img class="code_img_closed" id="code_img_closed_076c3dbf-4d97-42db-8857-405d3f11ae4a" alt="" src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" /><img class="code_img_opened" id="code_img_opened_076c3dbf-4d97-42db-8857-405d3f11ae4a" style="display: none" alt="" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" /><span class="cnblogs_code_collapse">View Code </span>
<div class="cnblogs_code_hide" id="cnblogs_code_open_076c3dbf-4d97-42db-8857-405d3f11ae4a"><pre><span style="color: #0000ff">package</span> com.mai.mina.diyChat;<br /><span style="color: #0000ff">import</span> java.awt.BorderLayout;<br /><span style="color: #0000ff">import</span> java.awt.event.ActionEvent;<br /><span style="color: #0000ff">import</span> java.awt.event.ActionListener;<br /><span style="color: #0000ff">import</span> java.awt.event.WindowAdapter;<br /><span style="color: #0000ff">import</span> java.awt.event.WindowEvent;<br /><br /><span style="color: #0000ff">import</span> javax.swing.JButton;<br /><span style="color: #0000ff">import</span> javax.swing.JFrame;<br /><span style="color: #0000ff">import</span> javax.swing.JLabel;<br /><span style="color: #0000ff">import</span> javax.swing.JPanel;<br /><span style="color: #0000ff">import</span> javax.swing.JScrollPane;<br /><span style="color: #0000ff">import</span> javax.swing.JTextArea;<br /><span style="color: #0000ff">import</span> javax.swing.JTextField;<br /><br /><span style="color: #0000ff">import</span> org.apache.commons.lang.math.RandomUtils;<br /><br /><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> ChatPanel <span style="color: #0000ff">extends</span> javax.swing.JPanel {<br />    <span style="color: #0000ff">private</span> JPanel northPanel;<br />    <span style="color: #0000ff">private</span> JLabel headLabel;<br />    <span style="color: #0000ff">private</span> JScrollPane jScrollPane1;<br />    <span style="color: #0000ff">private</span> JScrollPane jScrollPane2;<br />    <span style="color: #0000ff">private</span> JButton exitB;<br />    <span style="color: #0000ff">private</span> JButton clearMsgB;<br />    <span style="color: #0000ff">private</span> JButton sentB;<br />    <span style="color: #0000ff">private</span> JButton connectB;<br />    <span style="color: #0000ff">private</span> JTextArea messageText;<br />    <span style="color: #0000ff">private</span> JTextField nameText;<br />    <span style="color: #0000ff">private</span> JLabel nameLabel;<br />    <span style="color: #0000ff">private</span> JTextArea messageArea;<br />    <span style="color: #0000ff">private</span> JPanel southPanel;<br />    <span style="color: #0000ff">private</span> SimpleMinaClient client = <span style="color: #0000ff">null</span>;<br />    <span style="color: #0000ff">private</span> <span style="color: #0000ff">boolean</span> connected = <span style="color: #0000ff">false</span>;<br />    <span style="color: #0000ff">private</span> String username = <span style="color: #0000ff">null</span>;<br /><br />    {<br />        <span style="color: #008000">//</span><span style="color: #008000">Set Look &amp; Feel</span><span style="color: #008000"><br /></span>        <span style="color: #0000ff">try</span> {<br />            javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");<br />        } <span style="color: #0000ff">catch</span>(Exception e) {<br />            e.printStackTrace();<br />        }<br />    }<br /><br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> connect(){<br />        <span style="color: #0000ff">if</span>(client.connect()){<br />            username = nameText.getText().trim();<br />            <span style="color: #0000ff">if</span>(username == <span style="color: #0000ff">null</span> || "".equals(username)){<br />                username = "游客" + RandomUtils.nextInt(1000);<br />                nameText.setText(username);<br />            }<br />            connected = <span style="color: #0000ff">true</span>;<br />            dealUIWithFlag();<br />        }<span style="color: #0000ff">else</span>{<br />            connected = <span style="color: #0000ff">false</span>;   <br />            dealUIWithFlag();<br />            showMsg("连接服务器失败。。。");<br />        }<br />    }<br />    <br />    <br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> showMsg(String msg){<br />        messageArea.append(msg);<br />        messageArea.append("\n");<br />        messageArea.selectAll();<br />        messageArea.lostFocus(<span style="color: #0000ff">null</span>, <span style="color: #0000ff">this</span>);<br />    }<br />    <br />    <br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> sentMsg(){<br />        String message = username + ":" + messageText.getText();<br />        client.sentMsg(message);<br />        messageText.setText("");<br />        messageText.requestFocus();<br />    }<br />    <br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> dealUIWithFlag(){<br />        <span style="color: #0000ff">if</span>(connected){<br />            nameText.setEnabled(<span style="color: #0000ff">false</span>);<br />            connectB.setEnabled(<span style="color: #0000ff">false</span>);<br />            sentB.setEnabled(<span style="color: #0000ff">true</span>);<br />            clearMsgB.setEnabled(<span style="color: #0000ff">true</span>);<br />            exitB.setEnabled(<span style="color: #0000ff">true</span>);<br />        }<span style="color: #0000ff">else</span>{<br />            nameText.setEnabled(<span style="color: #0000ff">true</span>);<br />            connectB.setEnabled(<span style="color: #0000ff">true</span>);<br />            sentB.setEnabled(<span style="color: #0000ff">false</span>);<br />            clearMsgB.setEnabled(<span style="color: #0000ff">false</span>);<br />            exitB.setEnabled(<span style="color: #0000ff">false</span>);<br />        }<br />    }<br />    <br />    <br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> closeTheClient(){<br />        <span style="color: #0000ff">if</span>(client.close()){<br />            showMsg("连接已断开...");<br />            connected = <span style="color: #0000ff">false</span>;<br />            dealUIWithFlag();<br />        }<span style="color: #0000ff">else</span>{<br />            showMsg("无法断开连接...");<br />        }<br />    }<br />    <br /><br />    <br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> main(String[] args) {<br />        JFrame frame = <span style="color: #0000ff">new</span> JFrame();<br />        frame.getContentPane().add(<span style="color: #0000ff">new</span> ChatPanel());<br />        frame.addWindowListener(<span style="color: #0000ff">new</span> WindowAdapter(){<br />            <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> windowClosing(WindowEvent e){<br />                System.exit(0);<br />            }<br />        });<br />        frame.pack();<br />        frame.setLocationByPlatform(<span style="color: #0000ff">true</span>);<br />        frame.setVisible(<span style="color: #0000ff">true</span>);<br />    }<br />    <br />    <span style="color: #0000ff">public</span> ChatPanel() {<br />        <span style="color: #0000ff">super</span>();<br />        client = <span style="color: #0000ff">new</span> SimpleMinaClient(<span style="color: #0000ff">this</span>);<br />        initGUI();<br />        dealUIWithFlag();<br />    }<br />    <br />    <span style="color: #0000ff">private</span> <span style="color: #0000ff">void</span> initGUI() {<br />        <span style="color: #0000ff">try</span> {<br />            <span style="color: #0000ff">this</span>.setPreferredSize(<span style="color: #0000ff">new</span> java.awt.Dimension(400, 339));<br />            <span style="color: #0000ff">this</span>.setLayout(<span style="color: #0000ff">null</span>);<br />            {<br />                northPanel = <span style="color: #0000ff">new</span> JPanel();<br />                BorderLayout northPanelLayout = <span style="color: #0000ff">new</span> BorderLayout();<br />                northPanel.setLayout(northPanelLayout);<br />                <span style="color: #0000ff">this</span>.add(northPanel);<br />                northPanel.setBounds(0, 0, 400, 188);<br />                {<br />                    headLabel = <span style="color: #0000ff">new</span> JLabel();<br />                    northPanel.add(headLabel, BorderLayout.NORTH);<br />                    headLabel.setText("\u6b22\u8fce\u4f7f\u7528 (\u6d4b\u8bd5Ip:port --&gt; 127.0.0.1:8888)");<br />                    headLabel.setPreferredSize(<span style="color: #0000ff">new</span> java.awt.Dimension(397, 19));<br />                }<br />                {<br />                    jScrollPane1 = <span style="color: #0000ff">new</span> JScrollPane();<br />                    northPanel.add(jScrollPane1, BorderLayout.CENTER);<br />                    jScrollPane1.setPreferredSize(<span style="color: #0000ff">new</span> java.awt.Dimension(400, 169));<br />                    {<br />                        messageArea = <span style="color: #0000ff">new</span> JTextArea();<br />                        jScrollPane1.setViewportView(messageArea);<br />                        messageArea.setPreferredSize(<span style="color: #0000ff">new</span> java.awt.Dimension(398, 145));<br />                        messageArea.setEditable(<span style="color: #0000ff">false</span>);<br />                        messageArea.setLineWrap(<span style="color: #0000ff">true</span>);<br />                        messageArea.setWrapStyleWord(<span style="color: #0000ff">true</span>);<br />                    }<br />                }<br />            }<br />            {<br />                southPanel = <span style="color: #0000ff">new</span> JPanel();<br />                <span style="color: #0000ff">this</span>.add(southPanel);<br />                southPanel.setBounds(0, 194, 400, 145);<br />                southPanel.setLayout(<span style="color: #0000ff">null</span>);<br />                {<br />                    nameLabel = <span style="color: #0000ff">new</span> JLabel();<br />                    southPanel.add(nameLabel);<br />                    nameLabel.setText("\u6635\u79f0:");<br />                    nameLabel.setBounds(10, 12, 35, 15);<br />                }<br />                {<br />                    nameText = <span style="color: #0000ff">new</span> JTextField();<br />                    southPanel.add(nameText);<br />                    nameText.setText("\u6e38\u5ba2");<br />                    nameText.setBounds(45, 9, 96, 21);<br />                }<br />                {  <br />                    jScrollPane2 = <span style="color: #0000ff">new</span> JScrollPane();<br />                    southPanel.add(jScrollPane2);<br />                    jScrollPane2.setBounds(15, 37, 364, 69);<br />                    {<br />                        messageText = <span style="color: #0000ff">new</span> JTextArea();<br />                        jScrollPane2.setViewportView(messageText);<br />                        messageText.setBounds(101, 72, 362, 75);<br />                        messageText.setPreferredSize(<span style="color: #0000ff">new</span> java.awt.Dimension(362, 54));<br />                        messageText.setLineWrap(<span style="color: #0000ff">true</span>);<br />                        messageText.setWrapStyleWord(<span style="color: #0000ff">true</span>);<br />                    }<br />                }<br />                {<br />                    connectB = <span style="color: #0000ff">new</span> JButton();<br />                    southPanel.add(connectB);<br />                    connectB.setText("\u8fde\u63a5\u670d\u52a1\u5668");<br />                    connectB.setBounds(179, 8, 93, 23);<br />                    connectB.addActionListener(<span style="color: #0000ff">new</span> ActionListener() {<br />                        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> actionPerformed(ActionEvent evt) {<br />                            System.out.println("connectB.actionPerformed, event="+evt);<br />                            <span style="color: #008000">//</span><span style="color: #008000">TODO add your code for connectB.actionPerformed</span><span style="color: #008000"><br /></span>                            connect();<br />                        }<br />                    });<br />                }<br />                {<br />                    sentB = <span style="color: #0000ff">new</span> JButton();<br />                    southPanel.add(sentB);<br />                    sentB.setText("\u53d1\u9001");<br />                    sentB.setBounds(261, 116, 57, 23);<br />                    sentB.addActionListener(<span style="color: #0000ff">new</span> ActionListener() {<br />                        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> actionPerformed(ActionEvent evt) {<br />                            System.out.println("sentB.actionPerformed, event="+evt);<br />                            <span style="color: #008000">//</span><span style="color: #008000">TODO add your code for sentB.actionPerformed</span><span style="color: #008000"><br /></span>                            sentMsg();<br />                        }<br />                    });<br />                }<br />                {<br />                    clearMsgB = <span style="color: #0000ff">new</span> JButton();<br />                    southPanel.add(clearMsgB);<br />                    clearMsgB.setText("\u6e05\u7a7a");<br />                    clearMsgB.setBounds(324, 116, 57, 23);<br />                    clearMsgB.addActionListener(<span style="color: #0000ff">new</span> ActionListener() {<br />                        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> actionPerformed(ActionEvent evt) {<br />                            System.out.println("clearMsgB.actionPerformed, event="+evt);<br />                            <span style="color: #008000">//</span><span style="color: #008000">TODO add your code for clearMsgB.actionPerformed</span><span style="color: #008000"><br /></span>                            messageText.setText("");<br />                        }<br />                    });<br />                }<br />                {<br />                    exitB = <span style="color: #0000ff">new</span> JButton();<br />                    southPanel.add(exitB);<br />                    exitB.setText("\u6ce8\u9500");<br />                    exitB.setBounds(282, 8, 57, 23);<br />                    exitB.addActionListener(<span style="color: #0000ff">new</span> ActionListener() {<br />                        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> actionPerformed(ActionEvent evt) {<br />                            System.out.println("exitB.actionPerformed, event="+evt);<br />                            <span style="color: #008000">//</span><span style="color: #008000">TODO add your code for exitB.actionPerformed</span><span style="color: #008000"><br /></span>                            closeTheClient();<br />                        }<br />                    });<br />                }<br />            }<br />        } <span style="color: #0000ff">catch</span> (Exception e) {<br />            e.printStackTrace();<br />        } <br />    }<br /><br />}</pre></div></div>
<p><br /><strong>3. 运行结果</strong></p>
<p><strong></strong>　　首先启动服务器端，即运行SimpleMinaServer类 ， 启动成功时会在控制台中打印出&#8220;服务器启动成功"</p>
<p>　　接下来运行客户端ChatPanel。</p>
<p><img alt="" src="http://pic002.cnblogs.com/images/2012/312351/2012020812493082.png" /></p>
<p><br /><br />note: 上面只是一个简单的信息交互，其实使用Mina比较常用的还是在自定义协议处理这块。</p>
<p>　　　　所以，比较应该注重学习的是Filter这块。有时间大家可以去看看源码。</p><img src ="http://www.blogjava.net/hao446tian/aggbug/369973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hao446tian/" target="_blank">昊天</a> 2012-02-14 18:42 <a href="http://www.blogjava.net/hao446tian/archive/2012/02/14/369973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>