﻿<?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-Jelver'Sky-文章分类-J2ME</title><link>http://www.blogjava.net/jelver/category/23090.html</link><description>“一直很多人说我是天才，但我却相信这个世界没有天才。如果没有卓越的努力和娴熟的球性，你永远不会踢出精彩的足球。我从来不会低估努力的重要性，而这正是我对自己的要求。”
----------------------------------------------------------------------------------------------罗纳尔迪尼奥(Ronaldinho)--------
“不要叫我神童！我不是神童！我所获得的一切成就，都是我用汗水和刻苦训练换来的！” ---------------------------------丁俊辉（中国斯诺克公开赛冠军）---
</description><language>zh-cn</language><lastBuildDate>Wed, 06 Jun 2007 17:25:09 GMT</lastBuildDate><pubDate>Wed, 06 Jun 2007 17:25:09 GMT</pubDate><ttl>60</ttl><item><title>socket, nio socket 及nio socket框架MINA总结 (转)</title><link>http://www.blogjava.net/jelver/articles/122358.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Wed, 06 Jun 2007 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/122358.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/122358.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/122358.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/122358.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/122358.html</trackback:ping><description><![CDATA[<p><a href="http://blog.csdn.net/lcllcl987/archive/2007/04/16/1566114.aspx">http://blog.csdn.net/lcllcl987/archive/2007/04/16/1566114.aspx</a><br>nio学习：<br>最近花了点时间研究了一下nio，及其开源框架MINA，现把心得总结如下：<br>1：传统socket:阻塞式通信<br>每建立一个Socket连接时，同时创建一个新线程对该Socket进行单独通信（采用阻塞的方式通信）。<br>这种方式具有很高的响应速度，并且控制起来也很简单，在连接数较少的时候非常有效，但是如果<br>对每一个连接都产生一个线程的无疑是对系统资源的一种浪费，如果连接数较多将会出现资源不足的情况<br>example:<br>server code:</p>
<p>public class MultiUserServer extends Thread {<br>&nbsp;private Socket client;<br>&nbsp;<br>&nbsp;public MultiUserServer(Socket c) {<br>&nbsp;&nbsp;this.client = c;<br>&nbsp;}</p>
<p>&nbsp;public void run() {<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;BufferedReader in = new BufferedReader(new InputStreamReader(client<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getInputStream()));<br>&nbsp;&nbsp;&nbsp;PrintWriter out = new PrintWriter(client.getOutputStream());<br>&nbsp;&nbsp;&nbsp;//&nbsp;Mutil User but can't parallel<br>&nbsp;&nbsp;&nbsp;while (true) {<br>&nbsp;&nbsp;&nbsp;&nbsp;String str = in.readLine();<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);<br>&nbsp;&nbsp;&nbsp;&nbsp;SocketLog.debug("receive message: " + str);<br>&nbsp;&nbsp;&nbsp;&nbsp;out.println("has receive....");<br>&nbsp;&nbsp;&nbsp;&nbsp;out.flush();<br>&nbsp;&nbsp;&nbsp;&nbsp;if (str.equals("end"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;client.close();<br>&nbsp;&nbsp;} catch (IOException ex) {<br>&nbsp;&nbsp;} <br>&nbsp;}</p>
<p>&nbsp;public static void main(String[] args) throws IOException {<br>&nbsp;&nbsp;int port = 5678;<br>&nbsp;&nbsp;if (args.length &gt; 0)<br>&nbsp;&nbsp;&nbsp;port = Integer.parseInt(args[0]);<br>&nbsp;&nbsp;ServerSocket server = new ServerSocket(port);<br>&nbsp;&nbsp;SocketLog.debug("the server socket application is created!");<br>&nbsp;&nbsp;while (true) {<br>&nbsp;&nbsp;&nbsp;//&nbsp;transfer location change Single User or Multi User<br>&nbsp;&nbsp;&nbsp;MultiUserServer mu = new MultiUserServer(server.accept());<br>&nbsp;&nbsp;&nbsp;mu.start();<br>&nbsp;&nbsp;}<br>&nbsp;}<br>}</p>
<p>client code:</p>
<p>public class Client {</p>
<p>&nbsp;static Socket server;</p>
<p>&nbsp;public static void main(String[] args) throws Exception {<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;//set socket proxy.<br>&nbsp;&nbsp;String proxyHost = "192.168.254.212";<br>&nbsp;&nbsp;String proxyPort = "1080";<br>&nbsp;&nbsp;System.getProperties().put("socksProxySet","true");<br>&nbsp;&nbsp;System.getProperties().put("socksProxyHost",proxyHost);<br>&nbsp;&nbsp;System.getProperties().put("socksProxyPort",proxyPort); <br>&nbsp;&nbsp;<br>&nbsp;&nbsp;String host = "132.201.69.80";<br>&nbsp;&nbsp;int port = 13086;<br>&nbsp;&nbsp;if (args.length &gt; 1)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;host = args[0];<br>&nbsp;&nbsp;&nbsp;port = Integer.parseInt(args[1]);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;System.out.println("connetioning:" + host + ":" + port);<br>&nbsp;&nbsp;server = new Socket(host, port);<br>&nbsp;&nbsp;BufferedReader in = new BufferedReader(new InputStreamReader(server<br>&nbsp;&nbsp;&nbsp;&nbsp;.getInputStream()));<br>&nbsp;&nbsp;PrintWriter out = new PrintWriter(server.getOutputStream());<br>&nbsp;&nbsp;BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));<br>&nbsp;&nbsp;while (true) {<br>&nbsp;&nbsp;&nbsp;String str = wt.readLine();<br>&nbsp;&nbsp;&nbsp;out.println(str);<br>&nbsp;&nbsp;&nbsp;out.flush();<br>&nbsp;&nbsp;&nbsp;if (str.equals("end")) {<br>&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;System.out.println(in.readLine());<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;server.close();<br>&nbsp;}<br>}</p>
<p>2.nio:非阻塞通讯模式<br>２．１NIO 设计背后的基石：反应器模式，用于事件多路分离和分派的体系结构模式。 <br>反应器模式的核心功能如下：<br>将事件多路分用 <br>将事件分派到各自相应的事件处理程序 </p>
<p>NIO 的非阻塞 I/O 机制是围绕 选择器和 通道构建的。 Channel 类表示服务器和客户机之间的<br>一种通信机制。Selector 类是 Channel 的多路复用器。 Selector 类将传入客户机请求多路分<br>用并将它们分派到各自的请求处理程序。<br>通道(Channel 类)：表示服务器和客户机之间的一种通信机制。 <br>选择器(Selector类)：是 Channel 的多路复用器。Selector 类将传入的客户机请求多路分用并将它们<br>分派到各自的请求处理程序。</p>
<p>简单的来说：</p>
<p>NIO是一个基于事件的IO架构，最基本的思想就是：有事件我通知你，你再去做你的事情．<br>而且NIO的主线程只有一个，不像传统的模型，需要多个线程以应对客户端请求，也减轻<br>了JVM的工作量。<br>当Channel注册至Selector以后，经典的调用方法如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (somecondition) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int n = selector.select(TIMEOUT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (n == 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator iter = selector.selectedKeys().iterator(); iter<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .hasNext();) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (key.isAcceptable())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doAcceptable(key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (key.isConnectable())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doConnectable(key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (key.isValid() &amp;&amp; key.isReadable())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doReadable(key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (key.isValid() &amp;&amp; key.isWritable())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doWritable(key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iter.remove();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>nio中取得事件通知，就是在selector的select事件中完成的。在selector事件时有一个线程<br>向操作系统询问，selector中注册的Channel&amp;&amp;SelectionKey的键值对的各种事件是否有发生，<br>如果有则添加到selector的selectedKeys属性Set中去，并返回本次有多少个感兴趣的事情发生。<br>如果发现这个值&gt;0，表示有事件发生，马上迭代selectedKeys中的SelectionKey，<br>根据Key中的表示的事件，来做相应的处理。<br>实际上，这段说明表明了异步socket的核心，即异步socket不过是将多个socket的调度（或者还有他们的线程调度）<br>全部交给操作系统自己去完成，异步的核心Selector，不过是将这些调度收集、分发而已。<br>2.2 nio example:<br>server code：</p>
<p><br>public class NonBlockingServer<br>{<br>&nbsp;&nbsp;&nbsp; public Selector sel = null;<br>&nbsp;&nbsp;&nbsp; public ServerSocketChannel server = null;<br>&nbsp;&nbsp;&nbsp; public SocketChannel socket = null;<br>&nbsp;&nbsp;&nbsp; public int port = 4900;<br>&nbsp;&nbsp;&nbsp; String result = null;</p>
<p><br>&nbsp;&nbsp;&nbsp; public NonBlockingServer()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;System.out.println("Inside default ctor");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;public NonBlockingServer(int port)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;System.out.println("Inside the other ctor");<br>&nbsp;&nbsp;this.port = port;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void initializeOperations() throws IOException,UnknownHostException<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;System.out.println("Inside initialization");<br>&nbsp;&nbsp;sel = Selector.open();<br>&nbsp;&nbsp;server = ServerSocketChannel.open();<br>&nbsp;&nbsp;server.configureBlocking(false);<br>&nbsp;&nbsp;InetAddress ia = InetAddress.getLocalHost();<br>&nbsp;&nbsp;InetSocketAddress isa = new InetSocketAddress(ia,port);<br>&nbsp;&nbsp;server.socket().bind(isa);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;public void startServer() throws IOException<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;System.out.println("Inside startserver");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initializeOperations();<br>&nbsp;&nbsp;System.out.println("Abt to block on select()");<br>&nbsp;&nbsp;SelectionKey acceptKey = server.register(sel, SelectionKey.OP_ACCEPT );&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;while (acceptKey.selector().select() &gt; 0 )<br>&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;Set readyKeys = sel.selectedKeys();<br>&nbsp;&nbsp;&nbsp;Iterator it = readyKeys.iterator();</p>
<p>&nbsp;&nbsp;&nbsp;while (it.hasNext()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;SelectionKey key = (SelectionKey)it.next();<br>&nbsp;&nbsp;&nbsp;&nbsp;it.remove();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;if (key.isAcceptable()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Key is Acceptable");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerSocketChannel ssc = (ServerSocketChannel) key.channel();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket = (SocketChannel) ssc.accept();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.configureBlocking(false);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectionKey another = socket.register(sel,SelectionKey.OP_READ|SelectionKey.OP_WRITE);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;if (key.isReadable()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Key is readable");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String ret = readMessage(key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ret.length() &gt; 0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeMessage(socket,ret);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;if (key.isWritable()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("THe key is writable");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String ret = readMessage(key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket = (SocketChannel)key.channel();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (result.length() &gt; 0 ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeMessage(socket,ret);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void writeMessage(SocketChannel socket,String ret)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;System.out.println("Inside the loop");</p>
<p>&nbsp;&nbsp;if (ret.equals("quit") || ret.equals("shutdown")) {<br>&nbsp;&nbsp;&nbsp;return;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;String s = "This is context from server!-----------------------------------------";<br>&nbsp;&nbsp;&nbsp;Charset set = Charset.forName("us-ascii");<br>&nbsp;&nbsp;&nbsp;CharsetDecoder dec = set.newDecoder();<br>&nbsp;&nbsp;&nbsp;CharBuffer charBuf = dec.decode(ByteBuffer.wrap(s.getBytes()));<br>&nbsp;&nbsp;&nbsp;System.out.println(charBuf.toString());<br>&nbsp;&nbsp;&nbsp;int nBytes = socket.write(ByteBuffer.wrap((charBuf.toString()).getBytes()));<br>&nbsp;&nbsp;&nbsp;System.out.println("nBytes = "+nBytes);<br>&nbsp;&nbsp;&nbsp;&nbsp;result = null;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;catch(Exception e)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp; }<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; public String readMessage(SelectionKey key)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;int nBytes = 0;<br>&nbsp;&nbsp;socket = (SocketChannel)key.channel();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByteBuffer buf = ByteBuffer.allocate(1024);<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nBytes = socket.read(buf);<br>&nbsp;&nbsp;&nbsp;buf.flip();<br>&nbsp;&nbsp;&nbsp;Charset charset = Charset.forName("us-ascii");<br>&nbsp;&nbsp;&nbsp;CharsetDecoder decoder = charset.newDecoder();<br>&nbsp;&nbsp;&nbsp;CharBuffer charBuffer = decoder.decode(buf);<br>&nbsp;&nbsp;&nbsp;result = charBuffer.toString();<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;catch(IOException e)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return result;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String args[])<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;NonBlockingServer nb;<br>&nbsp;&nbsp;&nbsp; &nbsp;if (args.length &lt; 1)<br>&nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;nb = new NonBlockingServer();<br>&nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp;&nbsp; &nbsp;else<br>&nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;int port = Integer.parseInt(args[0]);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;nb = new NonBlockingServer(port);<br>&nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;nb.startServer();<br>&nbsp;&nbsp;&nbsp;System.out.println("the nonBlocking server is started!");<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;catch (IOException e)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;System.exit(-1);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;<br>&nbsp;}<br>}</p>
<p>client code:</p>
<p>public class Client {<br>&nbsp;public SocketChannel client = null;</p>
<p>&nbsp;public InetSocketAddress isa = null;</p>
<p>&nbsp;public RecvThread rt = null;</p>
<p>&nbsp;private String host;</p>
<p>&nbsp;private int port;</p>
<p>&nbsp;public Client(String host, int port) {<br>&nbsp;&nbsp;this.host = host;<br>&nbsp;&nbsp;this.port = port;<br>&nbsp;}</p>
<p>&nbsp;public void makeConnection() {<br>&nbsp;&nbsp;String proxyHost = "192.168.254.212";<br>&nbsp;&nbsp;String proxyPort = "1080";<br>&nbsp;&nbsp;System.getProperties().put("socksProxySet", "true");<br>&nbsp;&nbsp;System.getProperties().put("socksProxyHost", proxyHost);<br>&nbsp;&nbsp;System.getProperties().put("socksProxyPort", proxyPort);</p>
<p>&nbsp;&nbsp;int result = 0;<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;client = SocketChannel.open();<br>&nbsp;&nbsp;&nbsp;isa = new InetSocketAddress(host, port);<br>&nbsp;&nbsp;&nbsp;client.connect(isa);<br>&nbsp;&nbsp;&nbsp;client.configureBlocking(false);<br>&nbsp;&nbsp;&nbsp;receiveMessage();<br>&nbsp;&nbsp;} catch (UnknownHostException e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;} catch (IOException e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;long begin = System.currentTimeMillis();</p>
<p>&nbsp;&nbsp;sendMessage();</p>
<p>&nbsp;&nbsp;long end = System.currentTimeMillis();<br>&nbsp;&nbsp;long userTime = end - begin;<br>&nbsp;&nbsp;System.out.println("use tiem: " + userTime);<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;interruptThread();<br>&nbsp;&nbsp;&nbsp;client.close();<br>&nbsp;&nbsp;&nbsp;System.exit(0);<br>&nbsp;&nbsp;} catch (IOException e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>&nbsp;public int sendMessage() {<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Inside SendMessage");<br>&nbsp;&nbsp;String msg = null;<br>&nbsp;&nbsp;ByteBuffer bytebuf;<br>&nbsp;&nbsp;int nBytes = 0;<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;msg = "It's message from client!";<br>&nbsp;&nbsp;&nbsp;System.out.println("msg is "+msg);<br>&nbsp;&nbsp;&nbsp;bytebuf = ByteBuffer.wrap(msg.getBytes());<br>&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; 1000; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;nBytes = client.write(bytebuf);<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(i + " finished");<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;interruptThread();<br>&nbsp;&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(5000);<br>&nbsp;&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;client.close();<br>&nbsp;&nbsp;&nbsp;return -1;</p>
<p>&nbsp;&nbsp;} catch (IOException e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;return nBytes;</p>
<p>&nbsp;}</p>
<p>&nbsp;public void receiveMessage() {<br>&nbsp;&nbsp;rt = new RecvThread("Receive THread", client);<br>&nbsp;&nbsp;rt.start();</p>
<p>&nbsp;}</p>
<p>&nbsp;public void interruptThread() {<br>&nbsp;&nbsp;rt.val = false;<br>&nbsp;}</p>
<p>&nbsp;public static void main(String args[]) {<br>&nbsp;&nbsp;if (args.length &lt; 2) {<br>&nbsp;&nbsp;&nbsp;System.err.println("You should put 2 args: host,port");<br>&nbsp;&nbsp;} else {<br>&nbsp;&nbsp;&nbsp;String host = args[0];<br>&nbsp;&nbsp;&nbsp;int port = Integer.parseInt(args[1]);<br>&nbsp;&nbsp;&nbsp;Client cl = new Client(host, port);<br>&nbsp;&nbsp;&nbsp;cl.makeConnection();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;BufferedReader in = new BufferedReader(new InputStreamReader(System.in));<br>&nbsp;&nbsp;String msg;</p>
<p>&nbsp;}</p>
<p>&nbsp;public class RecvThread extends Thread {<br>&nbsp;&nbsp;public SocketChannel sc = null;</p>
<p>&nbsp;&nbsp;public boolean val = true;</p>
<p>&nbsp;&nbsp;public RecvThread(String str, SocketChannel client) {<br>&nbsp;&nbsp;&nbsp;super(str);<br>&nbsp;&nbsp;&nbsp;sc = client;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;public void run() {<br>&nbsp;&nbsp;&nbsp;int nBytes = 0;<br>&nbsp;&nbsp;&nbsp;ByteBuffer buf = ByteBuffer.allocate(2048);<br>&nbsp;&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;&nbsp;while (val) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while ((nBytes = nBytes = client.read(buf)) &gt; 0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.flip();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Charset charset = Charset.forName("us-ascii");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CharsetDecoder decoder = charset.newDecoder();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CharBuffer charBuffer = decoder.decode(buf);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String result = charBuffer.toString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("the server return: " + result);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.flip();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;} catch (IOException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();</p>
<p>&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;}<br>&nbsp;}<br>}<br>3：Socket网络框架 MINA<br>MINA是一个网络应用框架，在不牺牲性能和可扩展性的前提下用于解决如下问题：<br>1：快速开发自己的英勇。<br>2：高可维护性，高可复用性：网络I/O编码，消息的编/解码，业务逻辑互相分离。<br>3：相对容易的进行单元测试。</p>
<p>&nbsp;</p>
<p>3.1 IoFilters：<br>IoFilter为MINA的功能扩展提供了接口。它拦截所有的IO事件进行事件的预处理和后处理(AOP)。我们可以把它想象成<br>Servlet的filters。<br>IoFilter能够实现以下几种目的：<br>事件日志<br>性能检测<br>数据转换(e.g. SSL support)，codec<br>防火墙&#8230;等等 </p>
<p>3.2 codec: ProtocolCodecFactory<br>MINA提供了方便的Protocol支持。如上说讲，codec在IoFilters中设置。<br>通过它的Encoder和Decoder，可以方便的扩展并支持各种基于Socket的网络协议，比如HTTP服务器、FTP服务器、Telnet服务器等等。</p>
<p>要实现自己的编码/解码器(codec)只需要实现interface: ProtocolCodecFactory即可.<br>在MINA 1.0版本，MINA已经实现了几个常用的(codec factory):</p>
<p>DemuxingProtocolCodecFactory, <br>NettyCodecFactory, <br>ObjectSerializationCodecFactory, <br>TextLineCodecFactory<br>&nbsp;<br>其中：<br>TextLineCodecFactory:<br>&nbsp;A ProtocolCodecFactory that performs encoding and decoding between a text line data and a Java <br>&nbsp;string object. This codec is useful especially when you work with a text-based protocols such as SMTP and IMAP.</p>
<p>ObjectSerializationCodecFactory:<br>A ProtocolCodecFactory that serializes and deserializes Java objects. This codec is very useful when <br>you have to prototype your application rapidly without any specific codec. </p>
<p>DemuxingProtocolCodecFactory：<br>A composite ProtocolCodecFactory that consists of multiple MessageEncoders and MessageDecoders. ProtocolEncoder<br>and ProtocolDecoder this factory returns demultiplex incoming messages and buffers to appropriate MessageEncoders <br>and MessageDecoders.</p>
<p>NettyCodecFactory:<br>A MINA ProtocolCodecFactory that provides encoder and decoder for Netty2 Messages and MessageRecognizers.</p>
<p>3.3 business logic: IoHandler</p>
<p>MINA中，所有的业务逻辑都有实现了IoHandler的class完成<br>interfaceHandles:<br>&nbsp;all protocol events fired by MINA. There are 6 event handler methods, and they are all invoked by MINA automatically. <br>&nbsp;当事件发生时，将触发IoHandler中的方法:<br>&nbsp;sessionCreated, sessionOpened, sessionClosed, sessionIdle, exceptionCaught, messageReceived, messageSent<br>MINA 1.O中，IoHandler的实现类：<br>ChainedIoHandler, DemuxingIoHandler, IoHandlerAdapter, SingleSessionIoHandlerDelegate, StreamIoHandler <br>具体细节可参考javadoc。</p>
<p>3.4&nbsp; &nbsp;MINA的高级主题：线程模式<br>MINA通过它灵活的filter机制来提供多种线程模型。<br>没有线程池过滤器被使用时MINA运行在一个单线程模式。<br>如果添加了一个IoThreadPoolFilter到IoAcceptor，将得到一个leader-follower模式的线程池。<br>如果再添加一个ProtocolThreadPoolFilter，server将有两个线程池；<br>一个(IoThreadPoolFilter)被用于对message对象进行转换，另外一个(ProtocolThreadPoolFilter)被用于处理业务逻辑。 <br>SimpleServiceRegistry加上IoThreadPoolFilter和ProtocolThreadPoolFilter的缺省实现即可适用于需<br>要高伸缩性的应用。如果想使用自己的线程模型，请参考SimpleServiceRegistry的源代码，并且自己</p>
<p>初始化Acceptor。</p>
<p>IoThreadPoolFilter threadPool = new IoThreadPoolFilter();threadPool.start();<br>IoAcceptor acceptor = new SocketAcceptor();<br>acceptor.getFilterChain().addLast( "threadPool", threadPool);<br>ProtocolThreadPoolFilter threadPool2 = new ProtocolThreadPoolFilter();<br>threadPool2.start();<br>ProtocolAcceptor acceptor2 = new IoProtocolAcceptor( acceptor );<br>acceptor2.getFilterChain().addLast( "threadPool", threadPool2 );<br>...<br>threadPool2.stop();<br>threadPool.stop();</p>
<p><br>采用MINA进行socket开发，一般步骤如下：<br>1：<br>server:<br>IoAcceptor acceptor = new SocketAcceptor(); //建立client接收器<br>or client:<br>SocketConnector connector = new SocketConnector();&nbsp; //建立一个连接器<br>2：server的属性配置：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SocketAcceptorConfig cfg = new SocketAcceptorConfig();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.setReuseAddress(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.getFilterChain().addLast(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "codec",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) ); //对象序列化 codec factory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.getFilterChain().addLast( "logger", new LoggingFilter() );<br>3：绑定address和business logic<br>server:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acceptor.bind(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new InetSocketAddress( SERVER_PORT ),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ServerSessionHandler( ), cfg ); // 绑定address和handler</p>
<p>client:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connector.connect(new InetSocketAddress( HOSTNAME, PORT ),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ClientSessionHandler(msg), cfg );</p>
<p>下面的这个简单的example演示client和server传递object的过程：<br>Message.java<br>public class Message implements Serializable {</p>
<p>&nbsp;&nbsp;&nbsp; private int type;<br>&nbsp;&nbsp;&nbsp; private int status;<br>&nbsp;&nbsp;&nbsp; private String msgBody;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public Message(int type, int status, String msgBody)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.type = type;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.status = status;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.msgBody = msgBody;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public String getMsgBody() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return msgBody;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void setMsgBody(String msgBody) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.msgBody = msgBody;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public int getStatus() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return status;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void setStatus(int status) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.status = status;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public int getType() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return type;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void setType(int type) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.type = type;<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>Client.java<br>public class Client<br>{<br>&nbsp;&nbsp;&nbsp; private static final String HOSTNAME = "localhost";<br>&nbsp;&nbsp;&nbsp; private static final int PORT = 8080;<br>&nbsp;&nbsp;&nbsp; private static final int CONNECT_TIMEOUT = 30; // seconds</p>
<p><br>&nbsp;&nbsp;&nbsp; public static void main( String[] args ) throws Throwable<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SocketConnector connector = new SocketConnector();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Configure the service.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SocketConnectorConfig cfg = new SocketConnectorConfig();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.setConnectTimeout( CONNECT_TIMEOUT );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.getFilterChain().addLast(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "codec",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.getFilterChain().addLast( "logger", new LoggingFilter() );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IoSession session;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message msg = new Message(0,1,"hello");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connector.connect(new InetSocketAddress( HOSTNAME, PORT ),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ClientSessionHandler(msg), cfg );</p>
<p>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>ClientSessionHandler.java<br>public class ClientSessionHandler extends IoHandlerAdapter<br>{<br>&nbsp;&nbsp;&nbsp; private Object msg;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public ClientSessionHandler(Object msg)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.msg = msg;<br>&nbsp;&nbsp;&nbsp; }</p>
<p><br>&nbsp;&nbsp;&nbsp; public void sessionOpened( IoSession session )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.write(this.msg);<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void messageReceived( IoSession session, Object message )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("in messageReceived!");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message rm = (Message ) message;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SessionLog.debug(session, rm.getMsgBody());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("message is: " + rm.getMsgBody());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.write(rm);<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void exceptionCaught( IoSession session, Throwable cause )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.close();<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>Server.java<br>public class Server<br>{<br>&nbsp;&nbsp;&nbsp; private static final int SERVER_PORT = 8080;</p>
<p>&nbsp;&nbsp;&nbsp; public static void main( String[] args ) throws Throwable<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IoAcceptor acceptor = new SocketAcceptor();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Prepare the service configuration.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SocketAcceptorConfig cfg = new SocketAcceptorConfig();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.setReuseAddress( true );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.getFilterChain().addLast(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "codec",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.getFilterChain().addLast( "logger", new LoggingFilter() );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acceptor.bind(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new InetSocketAddress( SERVER_PORT ),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ServerSessionHandler( ), cfg );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( "The server Listening on port " + SERVER_PORT );<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>ServerSessionHandler.java<br>public class ServerSessionHandler extends IoHandlerAdapter<br>{<br>&nbsp;&nbsp;&nbsp; public void sessionOpened( IoSession session )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // set idle time to 60 seconds<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setIdleTime( IdleStatus.BOTH_IDLE, 60 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute("times",new Integer(0));<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void messageReceived( IoSession session, Object message )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("in messageReceived");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int times = ((Integer)(session.getAttribute("times"))).intValue();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("tiems = " + times);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // communicate 30 times,then close the session.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (times &lt; 30)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; times++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute("times", new Integer(times));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message msg;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg = (Message) message;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg.setMsgBody("in server side: " + msg.getMsgBody());&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("begin send msg: " + msg.getMsgBody());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.write(msg);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void sessionIdle( IoSession session, IdleStatus status )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SessionLog.info( session, "Disconnecting the idle." );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // disconnect an idle client<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.close();<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void exceptionCaught( IoSession session, Throwable cause )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // close the connection on exceptional situation<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.close();<br>&nbsp;&nbsp;&nbsp; }<br>}<br>MINA自己附带的Demo已经很好的说明了它的运用。<br>值得一提的是它的SumUp：客户端发送几个数字，服务端求和后并返回结果。这个简单的程序演示了如何自己实现CODEC。</p>
<p>补充提示：<br>下载并运行MINA的demo程序还颇非周折:<br>运行MINA demo appli擦tion：<br>1:在JDK5<br>产生错误:<br>Exception in thread "main" java.lang.NoClassDefFoundError: edu/emory/mathcs/backport/java/util/concurrent/Executor<br>&nbsp;at org.apache.mina.example.reverser.Main.main(Main.java:44)<br>&nbsp;<br>察看mina的QA email:<br><a href="http://www.mail-archive.com/mina-dev@directory.apache.org/msg02252.html">http://www.mail-archive.com/mina-dev@directory.apache.org/msg02252.html</a></p>
<p>原来需要下载:backport-util-concurrent.jar并加入classpath<br><a href="http://dcl.mathcs.emory.edu/util/backport-util-concurrent/">http://dcl.mathcs.emory.edu/util/backport-util-concurrent/</a></p>
<p>继续运行还是报错:<br>Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory</p>
<p>原来MINA采用了slf4j项目作为log，继续下载<br>slf4j-simple.jar等，并加入classpath:<br><a href="http://www.slf4j.org/download.html">http://www.slf4j.org/download.html</a></p>
<img src ="http://www.blogjava.net/jelver/aggbug/122358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">冰河快狼</a> 2007-06-06 14:31 <a href="http://www.blogjava.net/jelver/articles/122358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>