- 浏览: 764559 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (208)
- Java (77)
- JavaScript (16)
- UML (1)
- Spring (24)
- Hibernate (11)
- J2EE部署 (18)
- 操作系统 (13)
- struts (11)
- jsp (3)
- J2EE (34)
- 数据库 (22)
- tomcat (4)
- apache (2)
- MyEclipse (13)
- Linux (14)
- Ext (6)
- Weblogic (2)
- 数据库 Oracle 空表导出 (1)
- Oracle (3)
- 编码 乱码 (1)
- 多线程 (5)
- jQuery (2)
- Apache Mina (1)
- ibatis (6)
- abator (1)
- svn (1)
- jvm (1)
- ERwin (2)
- mysql (2)
- ant (1)
- memcache (1)
- dubbo (1)
- PowerDesigner (1)
最新评论
-
di1984HIT:
Shallow heap & Retained heap -
tinguo002:
非常感谢 , 太棒了。
Spring注解方式,异常 'sessionFactory' or 'hibernateTemplate' is required的解决方法 -
白天看黑夜:
Apache Mina Server 2.0 中文参考手册(带 ...
Apache Mina – 简单的客户端/服务端应用示例 -
wumingxingzhe:
好文
Shallow heap & Retained heap -
di1984HIT:
学习了!!
工作流(Workflow)和BPM的不同
最近用到Socket套接字编程,在服务器监听方面还没有具体思路,朋友推荐了Apahce Mina,就在官方看了一下快速入门文档。原文是英文的,学习之余就将它翻译出来和大家共享!关于Mina的中文简介内容不多就摘抄了一些。
“MINA是一个Socket的网络框架,但是它提供了方便的Protocol支持,通过它的Encoder和Decoder,你将你的应用可以方便的扩展并支持各种基于Socket的网络协议,比如HTTP服务器、FTP服务器(当然,这很复杂)、Telnet服务器等等。基于MINA用户可以容易地开发高性能和高伸缩性的网络应用程序。”
下面是对官方入门文档的中文译版,由于完全参照官方文档在程序具体运行时遇到一些import不足的情况,在示例源码的import是我在亲自实践后修改过的,其他的地方都和原文一样。
Apache MINA 快速入门
1简介
建立一个基于MINA的时间服务器,下面的内容需要先准备好。
1,Mina 1.1 Core
2,JDK 1.5 or greater
3,SLF4J 1.3.0 or greater :
Log4J 1.2 users: slf4j-api.jar, slf4j-log4j12.jar, and Log4J 1.2.x
Log4J 1.3 users: slf4j-api.jar, slf4j-log4j13.jar, and Log4J 1.3.x
java.util.logging users: slf4j-api.jar and slf4j-jdk14.jar
注意:首先请确认你使用了正确的slf4j-*.jar 。比如说slf4j-log4j12.jar 和log4j-1.3.x.jar 是不能在一起使用的,将会出现功能障碍。
(我用了1.2系列,那么所有的软件包就是:
log4j-1.2.14.jar;
mina-core-1.1.2.jar;
slf4j-api-1.2.jar;
slf4j-jdk14-1.2.jar;
slf4j-log4j12-1.2.jar)
这个程序只测试了Windows2000pro 和 Linux系统,并且在做的时候没有依赖于一些开发平台的环境。
2编写MINA时间服务
下面先建立一个文件MinaTimeServer.java,代码如下:
下面会慢慢将这个类写完,这里先定义一个main用于启动程序。这一步结束后,还需要一个监听连接的对象,因为这个程序是基于TCP/IP的,这里将增加一个SocketAcceptor。
通过这里的SocketAcceptor类,下面将把它绑定到一个端口上,如果你想增加一个线程模型到该类的话,参考"配置线程模型"部分。
现在我们为SocketAcceptor添加设置。它允许我们为Socekt配置明确套接字用于允许来自客户端的连接。
SocketAcceptorConfig类的实例用于当我们每次准备启动acceptor的时候进入这个acceptor。
首先,我们设置一个重用地址标识。从 JDK Documentation可以了解更多关于这里的知识。
然后我们在配置中添加一个过滤器。这个过滤器filter将记录所有信息,例如最近创建的sessions,收到的消息,发送的消息,session关闭。
下一个过滤器是一个ProtocolCodecFilter。这个过滤器可以将二进制数据或编码协议数据转换成消息对象和代替法。
下面的部分来为acceptor绑定端口。这个方法标志着服务器进程的启动,如果这个方法没有被调用,服务器将不会与客户端进行连接。
这里定义了一个整型的端口变量,呼叫SocketAcceptor.bind(SocketAddress,IoHandler,cfg),第一个参数是要监听的网址,是本地的9123端口。
第二个参数传的是实现IoHandler接口的类,是服务于所有的客户端请求的。在这里,将会扩展IoHandlerAdapter类,这类遵循"适配器设计模式"的。
第三个参数是配置对象,用于配置日志和编码过滤器。每一个信息都会通过在IoAcceptor中定义的过滤器链的所有过滤器。在这风景点,将会将信息通过日志和编码过滤器。日志过滤器用SL4J库记录信息,而编码过滤器则反编码所有收到的信息,并且将所有TextLineCodecFactory发送的信息进行编码。
下面就是TimeServerHandler类的代码:
这里用于管理信息,覆盖了exceptionCaught,messageReceived 和 sessionCreated 方法,如前所示,该类扩展了IoHandlerAdapter。
exceptionCaught 方法将会打印错误并且关闭对话,对于大多数的情况来讲,这是标准的处理方法,除非能从异常中恢复过来。
messageReceived 方法将收到从客户端发来的数据,并且写回当前时间。如果收到了"quit",对话将被关闭。该方法将当前时间发往客户端,依赖于你使用的协议编码,发送至方法的对象(第二个参数)会有不同,发送到session.write(Object)方法的对象类同。如果你没有指定协议编码,则一般会收到ByteBuffer对象,而发送的也要是ByteBuffer对象。
sessionCreated 方法用于对话初始化,在这里,先打印一条信息,然后判断对话的类型,再设置缓冲大小,这里设置的是2048个字节。空闲时间设置为10秒,如果覆盖了sessionIdle方法,则该方法每10秒被呼叫一次。
3测试
到这里,编译程序。如果成功,那么启动程序,登陆telnet访问程序,如下所示:
客户端内容:
服务端内容:
4 参考文档
Apache MINA Quick Start Guide http://mina.apache.org/documentation.html
(ps:setReuseAddress( true )这个方法正好解决了我最近遇到的一个难题。就是,一个JAVA的SOCKET服务,在LINUX服务器上kill掉了,但是端口仍然被占用,要过一段时间才能释放)
“MINA是一个Socket的网络框架,但是它提供了方便的Protocol支持,通过它的Encoder和Decoder,你将你的应用可以方便的扩展并支持各种基于Socket的网络协议,比如HTTP服务器、FTP服务器(当然,这很复杂)、Telnet服务器等等。基于MINA用户可以容易地开发高性能和高伸缩性的网络应用程序。”
下面是对官方入门文档的中文译版,由于完全参照官方文档在程序具体运行时遇到一些import不足的情况,在示例源码的import是我在亲自实践后修改过的,其他的地方都和原文一样。
Apache MINA 快速入门
1简介
建立一个基于MINA的时间服务器,下面的内容需要先准备好。
1,Mina 1.1 Core
2,JDK 1.5 or greater
3,SLF4J 1.3.0 or greater :
Log4J 1.2 users: slf4j-api.jar, slf4j-log4j12.jar, and Log4J 1.2.x
Log4J 1.3 users: slf4j-api.jar, slf4j-log4j13.jar, and Log4J 1.3.x
java.util.logging users: slf4j-api.jar and slf4j-jdk14.jar
注意:首先请确认你使用了正确的slf4j-*.jar 。比如说slf4j-log4j12.jar 和log4j-1.3.x.jar 是不能在一起使用的,将会出现功能障碍。
(我用了1.2系列,那么所有的软件包就是:
log4j-1.2.14.jar;
mina-core-1.1.2.jar;
slf4j-api-1.2.jar;
slf4j-jdk14-1.2.jar;
slf4j-log4j12-1.2.jar)
这个程序只测试了Windows2000pro 和 Linux系统,并且在做的时候没有依赖于一些开发平台的环境。
2编写MINA时间服务
下面先建立一个文件MinaTimeServer.java,代码如下:
public class MinaTimeServer { public static void main(String[] args) { // code will go here next } }
下面会慢慢将这个类写完,这里先定义一个main用于启动程序。这一步结束后,还需要一个监听连接的对象,因为这个程序是基于TCP/IP的,这里将增加一个SocketAcceptor。
import org.apache.mina.common.IoAcceptor; import org.apache.mina.transport.socket.nio.SocketAcceptor; public class MinaTimeServer { public static void main(String[] args) { // The following two lines change the default buffer type to 'heap', // which yields better performance. ByteBuffer.setUseDirectBuffers(false); ByteBuffer.setAllocator(new SimpleByteBufferAllocator()); IoAcceptor acceptor = new SocketAcceptor(); } }
通过这里的SocketAcceptor类,下面将把它绑定到一个端口上,如果你想增加一个线程模型到该类的话,参考"配置线程模型"部分。
现在我们为SocketAcceptor添加设置。它允许我们为Socekt配置明确套接字用于允许来自客户端的连接。
import java.io.IOException; import java.net.InetSocketAddress; import org.apache.mina.common.IoAcceptor; import org.apache.mina.transport.socket.nio.SocketAcceptor; public class MinaTimeServer { private static final int PORT = 9123; public static void main(String[] args) throws IOException { ByteBuffer.setUseDirectBuffers(false); ByteBuffer.setAllocator(new SimpleByteBufferAllocator()); IoAcceptor acceptor = new SocketAcceptor(); SocketAcceptorConfig cfg = new SocketAcceptorConfig(); cfg.getSessionConfig().setReuseAddress( true ); cfg.getFilterChain().addLast( "logger", new LoggingFilter() ); cfg.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" )))); } }
SocketAcceptorConfig类的实例用于当我们每次准备启动acceptor的时候进入这个acceptor。
首先,我们设置一个重用地址标识。从 JDK Documentation可以了解更多关于这里的知识。
然后我们在配置中添加一个过滤器。这个过滤器filter将记录所有信息,例如最近创建的sessions,收到的消息,发送的消息,session关闭。
下一个过滤器是一个ProtocolCodecFilter。这个过滤器可以将二进制数据或编码协议数据转换成消息对象和代替法。
下面的部分来为acceptor绑定端口。这个方法标志着服务器进程的启动,如果这个方法没有被调用,服务器将不会与客户端进行连接。
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.mina.common.ByteBuffer; import org.apache.mina.common.IoAcceptor; import org.apache.mina.common.SimpleByteBufferAllocator; import org.apache.mina.transport.socket.nio.SocketAcceptor; import org.apache.mina.filter.LoggingFilter; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.SocketAcceptorConfig; public class MinaTimeServer { private static final int PORT = 9123; public static void main(String[] args) throws IOException { ByteBuffer.setUseDirectBuffers(false); ByteBuffer.setAllocator(new SimpleByteBufferAllocator()); IoAcceptor acceptor = new SocketAcceptor(); SocketAcceptorConfig cfg = new SocketAcceptorConfig(); cfg.getFilterChain().addLast( "logger", new LoggingFilter() ); cfg.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" )))); acceptor.bind( new InetSocketAddress(PORT), new TimeServerHandler(), cfg); System.out.println("MINA Time server started."); } }
这里定义了一个整型的端口变量,呼叫SocketAcceptor.bind(SocketAddress,IoHandler,cfg),第一个参数是要监听的网址,是本地的9123端口。
第二个参数传的是实现IoHandler接口的类,是服务于所有的客户端请求的。在这里,将会扩展IoHandlerAdapter类,这类遵循"适配器设计模式"的。
第三个参数是配置对象,用于配置日志和编码过滤器。每一个信息都会通过在IoAcceptor中定义的过滤器链的所有过滤器。在这风景点,将会将信息通过日志和编码过滤器。日志过滤器用SL4J库记录信息,而编码过滤器则反编码所有收到的信息,并且将所有TextLineCodecFactory发送的信息进行编码。
下面就是TimeServerHandler类的代码:
import java.util.Date; import org.apache.mina.common.IoHandlerAdapter; import org.apache.mina.common.IoSession; public class TimeServerHandler extends IoHandlerAdapter { public void exceptionCaught(IoSession session, Throwable t) throws Exception { t.printStackTrace(); session.close(); } public void messageReceived(IoSession session, Object msg) throws Exception { String str = msg.toString(); if( str.trim().equalsIgnoreCase("quit") ) { session.close(); return; } Date date = new Date(); session.write( date.toString() ); System.out.println("Message written..."); } public void sessionCreated(IoSession session) throws Exception { System.out.println("Session created..."); if( session.getTransportType() == TransportType.SOCKET ) ((SocketSessionConfig) session.getConfig() ).setReceiveBufferSize( 2048 ); session.setIdleTime( IdleStatus.BOTH_IDLE, 10 ); } }
这里用于管理信息,覆盖了exceptionCaught,messageReceived 和 sessionCreated 方法,如前所示,该类扩展了IoHandlerAdapter。
exceptionCaught 方法将会打印错误并且关闭对话,对于大多数的情况来讲,这是标准的处理方法,除非能从异常中恢复过来。
messageReceived 方法将收到从客户端发来的数据,并且写回当前时间。如果收到了"quit",对话将被关闭。该方法将当前时间发往客户端,依赖于你使用的协议编码,发送至方法的对象(第二个参数)会有不同,发送到session.write(Object)方法的对象类同。如果你没有指定协议编码,则一般会收到ByteBuffer对象,而发送的也要是ByteBuffer对象。
sessionCreated 方法用于对话初始化,在这里,先打印一条信息,然后判断对话的类型,再设置缓冲大小,这里设置的是2048个字节。空闲时间设置为10秒,如果覆盖了sessionIdle方法,则该方法每10秒被呼叫一次。
3测试
到这里,编译程序。如果成功,那么启动程序,登陆telnet访问程序,如下所示:
客户端内容:
user@myhost:~> telnet 127.0.0.1 9123 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. hello Mon Apr 09 23:42:55 EDT 2007 quit Connection closed by foreign host. user@myhost:~>
服务端内容:
MINA Time server started. Session created... Message written...
4 参考文档
Apache MINA Quick Start Guide http://mina.apache.org/documentation.html
(ps:setReuseAddress( true )这个方法正好解决了我最近遇到的一个难题。就是,一个JAVA的SOCKET服务,在LINUX服务器上kill掉了,但是端口仍然被占用,要过一段时间才能释放)
发表评论
-
Eclipse,javaw 通过Proxifile代理ipv6协议问题解决
2015-03-17 18:06 2749myeclipse2010升级到myeclipse2014之后 ... -
初始化EHcache CacheManager时报java.net.UnknownHostException
2014-11-13 11:45 12460工程启动时,报一下异常: [wdfportal] [201 ... -
tomcat7可能带来的问题
2013-06-27 00:31 9441、struts标签校验更加严格,如果struts标签中存在嵌 ... -
iBatis执行insert后返回主键
2013-01-18 23:55 1607iBatis插入数据后,返回主键。级联操作很有用。省去了一次的 ... -
Shallow heap & Retained heap
2012-05-16 17:09 49007所有包含Heap Profling功能的工具(MAT, You ... -
什么是两阶段提交协议
2012-05-08 16:58 1024两阶段提交协议 实现分布式事务的关键就是两阶段提交协议。在此 ... -
Abator —— IBatis 代码生成工具
2012-04-03 18:31 18881、在eclipse安装abator插件http://ibat ... -
使用Eclipse远程调试Tomcat
2012-03-23 22:56 1468有些时候,调试不得不用外网,比如说做支付宝的支付接口,服务器后 ... -
Java compiler level does not match the version of the installed Java project fac
2012-03-02 11:32 1275问题现象:项目图标报错“Java compiler level ... -
WebService的事务处理
2012-03-01 15:03 1524如果你只是要解决两个系统之间的事务同步问题,可以采用判断服务是 ... -
线程池(java.util.concurrent.ThreadPoolExecutor)的使用
2012-02-29 15:50 2477一、简介 线程池类为 j ... -
myeclipse 颜色设置(保护视力)
2012-02-28 09:29 20421.window -> Preferences -> ... -
Quartz表达式解析
2012-02-08 14:40 774字段 允许值 允许的特 ... -
使用iBatis中报 java.sql.SQLException: 无效的列类型异常
2011-12-15 14:46 2199<!--Content表 插入应的 ... -
非常有用的proxool属性详细解说
2011-12-13 16:19 1576Proxool连接池是sourceforge下的一个开源项目, ... -
在工程中查找自己修改的所有代码
2011-12-09 17:41 1013在工程中查找自己修改的所有代码的方法: 1.工程右键 -&g ... -
如何在Eclipse中安装和使用ibatis插件Abator
2011-12-01 21:26 49351、获得abator: http://ibatis. ... -
newCachedThreadPool线程池
2011-11-20 11:35 42975public static ExecutorService n ... -
Apache Mina – 简单的客户端/服务端应用示例
2011-11-19 23:49 5479转自http://javasight.net/2011/05/ ... -
Class.forName()、Class.forName().newInstance() 、New 三者区别!
2011-11-15 09:18 1219终于明白为什么加载数据库驱动只用Class.forName() ...
相关推荐
Apache MINA 2.0 用户指南
本资源包含两个 pdf 文档,一本根据官方最新文档 (http://mina.apache.org/mina-project/userguide/user-guide-toc.html) 整理的 mina_2.0_user_guide_en.pdf,一个中文翻译的 mina_2.0_user_guide_cn.pdf。...
Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)
Apache_MINA_快速入门,开发中用到,自己想学的,可以看看。
ApacheMina入门 ApacheMina入门 ApacheMina入门 ApacheMina入门 ApacheMina入门
该文档较好的介绍了,apache mina框架的使用方法。
apache mina的入门完整学习资料,附加中文参考手册。
深入理解Apache_Mina_(1)----_Mina的几个类 深入理解Apache_Mina_(2)----_与IoFilter相关的几个类 深入理解Apache_Mina_(3)----_与IoHandler相关的几个类 深入理解Apache_Mina_(4)----_IoFilter和IoHandler的区别和...
Apache MINA 2 用户指南,,epub格式更符合移动端浏览,走过路过不要错过.
很详细的描述了apache mina 框架,对于那些对于英文不是很懂得人,这简直就是福音啊,哈哈
NULL 博文链接:https://royal2xiaose.iteye.com/blog/1558322
Apache MINA 线程模型配置 Mina配置
这个是我学的apache mina2.0学习笔记的实例
收集整理的Apache Mina chm pdf教程和帮助文档
Apache_MINA_2_用户指南.pdf
Apache MINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可靠性的网络应用程序。 apache-mina-2.0.7-bin.zip,apache-mina-2.0.7-src.zip,log4j-1.2.17.zip,slf4j-api-1.6.6.jar,slf4j-api-1.6.6-...
Apache MINA是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。 当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版...
apache mina 简单示例apache mina 简单示例apache mina 简单示例apache mina 简单示例apache mina 简单示例apache mina 简单示例
Apache MINA2实用手册 Apache MINA2实用手册