- 浏览: 120087 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
萨琳娜啊:
Java读源码之Netty深入剖析网盘地址:https://p ...
Netty 源码阅读学习 -
小灯笼:
Netty源码剖析视频教程网盘地址:https://pan.b ...
Netty 源码阅读学习 -
白天看黑夜:
Apache Mina Server 2.0 中文参考手册(带 ...
Apache MINA (2) Hello World! -
smart152829:
很不错的文章,最近看了看了夜行侠老师讲的Netty深入浅出源码 ...
Netty 源码阅读学习 -
liaohb:
为之疯狂的颜值,陶醉天年。
nio Selector 阻塞 唤醒 原理
了解完Apach MINA的一些基本概念Apache MINA (1) 简介 ,开始进入MINA相关的代码学习,以一个简单HelloWorld程序开始,完成客户端与服务端之间的通讯。
准备工作:
org.apache.mina 版本4.0
org.slf4j 1.6.1 (Simple Logging Facade for Java)mina所使用的日志框架,该版本是与mina4.0匹配的版本。
我是用maven管理项目依赖的,使用apache-maven-3.0.4
IDE:IntelliJ IDEA 10.0.3
开始HelloWorld:
1.maven的pom文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>example</groupId> <artifactId>example</artifactId> <version>1.0</version> <properties> <project.build.sourceEncoding>GBK</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.apache.mina</groupId> <artifactId>mina-core</artifactId> <version>2.0.4</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-nop</artifactId> <version>1.6.1</version> </dependency> </dependencies> </project>
2. 服务器代码:
a) 首先实现服务端的IoHandler代码SimpleMinaServerHandler。主要功能是打印客户端写入的信息,统计客户端的请求次数以及返回当前客户端是第几次访问。
package com.chiyan.apach.mina.server; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; import java.util.concurrent.atomic.AtomicInteger; /** * Created by IntelliJ IDEA. * 简单的消息处理器 * User: chiyan * Date: 12-7-19 * Time: 上午12:19 */ public class SimpleMinaServerHandler extends IoHandlerAdapter { private AtomicInteger count = new AtomicInteger(0); /** * 当一个客户端连接进入时 */ @Override public void sessionOpened(IoSession session) throws Exception { System.out.println("client connection : " + session.getRemoteAddress()); } /** * 当一个客户端关闭时 */ @Override public void sessionClosed(IoSession session) throws Exception { System.out.println("client disconnection : " +session.getRemoteAddress() + " is Disconnection"); } /** * 当接收到客户端的信息 * * @param session * @param message * @throws Exception */ @Override public void messageReceived(IoSession session, Object message) throws Exception { String str = (String)message; // 打印客户端 System.out.println("receive client message : [ " + str +" ]"); // 回写消息给客户端 session.write(count.incrementAndGet()); } }
b) 搭建服务端 MainServer:
package com.chiyan.apach.mina.server; import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.SocketAcceptor; import org.apache.mina.transport.socket.SocketSessionConfig; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; import java.io.IOException; import java.net.InetSocketAddress; /** * Created by IntelliJ IDEA. * User: chiyan * Date: 12-7-19 * Time: 上午12:27 */ public class MainServer { // 服务器端口 private static final int SERVER_PORT = 8899; public static void main(String[] args) throws Exception { //创建一个非阻塞的Server端Socket,用NIO SocketAcceptor acceptor = new NioSocketAcceptor(); // 定义每次接收数据大小 SocketSessionConfig sessionConfig = acceptor.getSessionConfig(); sessionConfig.setReadBufferSize(2048); //创建接受数据的过滤器 DefaultIoFilterChainBuilder chain = acceptor.getFilterChain(); //设定这个过滤器将一行一行(/r/n)的读取数据 chain.addLast("myChain", new ProtocolCodecFilter(new TextLineCodecFactory())); //设定服务器端的消息处理器: 一个 SimpleMinaServerHandler 对象 acceptor.setHandler(new SimpleMinaServerHandler()); //绑定端口,启动服务器 try { acceptor.bind(new InetSocketAddress(SERVER_PORT)); } catch (IOException e) { e.printStackTrace(); } System.out.println("Mina server is listing port:" + SERVER_PORT); } }
3. 客户端代码
a)首先实现客户端的IoHandler代码SimpleMinaClientHandler。主要功能是向服务端写消息,接收到服务端计数后再回写服务端。
package com.chiyan.apach.mina.client; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; /** * Created by IntelliJ IDEA. * User: chiyan * Date: 12-7-19 * Time: 上午12:31 */ public class SimpleMinaClientHandler extends IoHandlerAdapter { /** * 当客户端接受到消息时 */ @Override public void messageReceived(IoSession session, Object message) throws Exception { Integer num = Integer.valueOf((String)message); if(num == null || num >10){ session.close(true); return; } System.out.println("receive server num : [ " + num + " ]"); Thread.sleep(1000); session.write("client received num is : " + num + ", request next num"); } /** * 当一个客户端被关闭时 */ @Override public void sessionClosed(IoSession session) throws Exception { System.out.println("client disconnect"); } /** * 当一个客户端连接进入时 */ @Override public void sessionOpened(IoSession session) throws Exception { System.out.println("create connection to server :" + session.getRemoteAddress()); session.write("client started"); session.write("Hello World!"); } }
b)搭建客户端MainClient
package com.chiyan.apach.mina.client; import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketConnector; import java.net.InetSocketAddress; /** * Created by IntelliJ IDEA. * User: chiyan * Date: 12-7-19 * Time: 上午12:40 */ public class MainClient { /** * 服务器ip */ private static final String SERVER_IP="127.0.0.1"; /** * 服务器端口 */ private static final int SERVER_PORT=8899; public static void main(String []args){ //Create TCP/IP connection NioSocketConnector connector = new NioSocketConnector(); //创建接受数据的过滤器 DefaultIoFilterChainBuilder chain = connector.getFilterChain(); //设定这个过滤器将一行一行(/r/n)的读取数据 chain.addLast("myChain", new ProtocolCodecFilter(new TextLineCodecFactory())); //服务器的消息处理器:一个 SimpleMinaClientHandler 对象 connector.setHandler(new SimpleMinaClientHandler()); //set connect timeout connector.setConnectTimeoutMillis(30 * 1000); //连接到服务器: ConnectFuture cf = connector.connect(new InetSocketAddress(SERVER_IP,SERVER_PORT)); cf.awaitUninterruptibly(); cf.getSession().getCloseFuture().awaitUninterruptibly(); connector.dispose(); } }
运行程序:
1.服务端打印:
Mina server is listing port:8899 client connection : /127.0.0.1:50497 receive client message : [ client started ] receive client message : [ Hello World! ] receive client message : [ client received num is : 1, request next num ] receive client message : [ client received num is : 2, request next num ] receive client message : [ client received num is : 3, request next num ] receive client message : [ client received num is : 4, request next num ] receive client message : [ client received num is : 5, request next num ] receive client message : [ client received num is : 6, request next num ] receive client message : [ client received num is : 7, request next num ] receive client message : [ client received num is : 8, request next num ] receive client message : [ client received num is : 9, request next num ] receive client message : [ client received num is : 10, request next num ] client disconnection : /127.0.0.1:50497 is Disconnection
2.客户端打印:
create connection to server :/127.0.0.1:8899 receive server num : [ 1 ] receive server num : [ 2 ] receive server num : [ 3 ] receive server num : [ 4 ] receive server num : [ 5 ] receive server num : [ 6 ] receive server num : [ 7 ] receive server num : [ 8 ] receive server num : [ 9 ] receive server num : [ 10 ] client disconnect
小结:
通过一个Hello World完成了基于mina编写的客户端和服务端通信的例子,接下通过解析源代码的方式来了解mina客户端和服务端通讯的过程。Apache MINA (3) NioSocketAcceptor初始化
代码在附件中
- example.rar (29.6 KB)
- 下载次数: 101
评论
1 楼
白天看黑夜
2017-10-20
Apache Mina Server 2.0 中文参考手册(带目录),有需要的自己下载吧
http://www.itmayun.com/it/files/226631678709806/resource/484719910403706/1.html
http://www.itmayun.com/it/files/226631678709806/resource/484719910403706/1.html
发表评论
-
Disruptor 学习笔记
2015-04-12 23:06 3540Disruptor 是什么 Disruptor ... -
Zookeeper 笔记
2015-04-12 22:42 1207ZooKeeper ZooKeeper是一 ... -
java jvm笔记
2014-09-26 16:41 01. jconsole 设置环境变量:export DI ... -
Netty 源码阅读学习
2014-09-18 21:40 11057背景 最忌工作中接触到Netty相关应用场景,之 ... -
ThreadLocal
2014-08-05 21:08 503ThreadLocal作用 ThreadLocal提供了 ... -
ReentrantLock AQS 源码阅读笔记
2014-08-05 21:06 1172ReentrantLock是JDK1.5引入的,它拥有与sy ... -
Java 内存可见性与volatile
2014-06-28 23:24 2650在多核系统中,处理 ... -
ubuntu 搭建开发环境
2014-05-04 14:37 0win7 硬盘安装方法: http://diybbs.z ... -
nio Selector 阻塞 唤醒 原理
2014-03-18 16:18 25141Selector:java nio无阻塞io实现的关键。阻 ... -
java nio Buffer 学习笔记
2014-03-17 14:54 1507Buffer 是一个对象, 它 ... -
java nio channel 学习笔记
2014-03-10 23:20 1385Channel直译就是通道的意思,通道表示对数据源头和数据 ... -
java 动态代理
2013-09-25 23:29 1043java的动态代理可以动态的创建并动态的处理所代理的方法调 ... -
java 泛型通配符
2013-09-25 23:25 909泛型是Java SE 1.5的新特性,泛型的本质是参数化类 ... -
java堆和栈
2013-09-23 22:58 896Java把内存划分成两种 ... -
Java nio 基础概念笔记
2012-12-27 12:09 1179Channel: ServerSocketChanne ... -
Apache MINA (4) 接收处理请求的过程
2012-12-23 23:50 8535上一篇博客 Apache MINA (3) NioSocket ... -
Apache MINA (3) NioSocketAcceptor初始化
2012-12-09 16:53 9197上一篇博客Apache MINA (2) Hello Worl ... -
Apache MINA (1) 简介
2012-07-26 22:14 2395简介: Apache MINA(Mult ... -
BufferedInputStream 源码学习笔记
2012-06-17 19:01 9567BufferedInputStream 是一个带有内存缓冲的 ... -
java 反射内部类
2011-01-17 22:05 4522内部类的初始化同一般类的初始化基本相同,只是内部类的类名全称有 ...
相关推荐
Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)
Apache MINA2实用手册 Apache MINA2实用手册
这个是我学的apache mina2.0学习笔记的实例
深入理解Apache_Mina_(2)----_与IoFilter相关的几个类 深入理解Apache_Mina_(3)----_与IoHandler相关的几个类 深入理解Apache_Mina_(4)----_IoFilter和IoHandler的区别和联系 深入理解Apache_Mina_(5)----_配置Mina...
Apache Mina 2 官方教程翻译
Apache MINA 线程模型配置 Mina配置
Apache Mina 2 完全自学手册
收集整理的Apache Mina chm 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 mina 简单示例
apache mina实例免费下载,有很多实例代码简单易懂欢迎大家下载!
一个Apache MINA使用案例源代码ApacheMina
至于MINA2是什么,这里就不介绍了,有兴趣的可以自己去问一下度娘!
apache mina chm 格式的api帮助文档。
Apache MINA 2.0 用户指南
最新的Apache Mina v2.0.8 API手册,chm格式,2014年9月下旬制作。
NULL 博文链接:https://mina-java.iteye.com/blog/1115429